Diary of Sacred Fox - October 10, 2008

The Quintetには通算 179068 人(今日:0, 昨日:0)のお客様が来場しています

2008/10/10

bashスクリプトを蹂躙する

なんかLD_PRELOAD使ってmainの前に終了してみたりとか似たようなネタはいろんなところに転がってそうな気はするけど, そんなすごい話じゃないです
何をやるかというと, 既存の変更したくないシェルスクリプトや実行ファイルに手を加えずに, そこから呼ばれるプログラムの引数をいじったり別のプログラムを呼んだり
制限事項として, 対象のコマンドがフルパスで書かれている所には適用不可
最近のRedhat/Fedora系ディストリビューションでは/bin/shの実体がbashだったりするので, system(3)から呼ばれるコマンドも同様に乗っ取れます(試してないけど)

で, ナイーブにこれをやるにはPATHを弄って現にconsolehelperがこの方法をとっている手前のパスにフック用のスクリプトを置いて以下略となるわけですが, これはなぜならこの目的のために複数のファイルを用意する必要があるあまり美しいとは言えない
そこで, フック用のコマンドをbash関数としてexportすることに
具体的には例えば以下のように書くことになるかと

function createrepo() {
  command createrepo --update -d $@
}
export -f createrepo

これで以降実行されるcreaterepoコマンドには無条件で--update -dオプションが渡るようになります
bash builtinのfunction, command, exportの各コマンドの説明はbash上でhelp commandとかやれば出てくるかと
あとはこれを書いたスクリプトをsourceするなり, さらに下にexec bashと書いて実行するなりすればそこから先の環境では幸せな世界が待ってます
同様の方法でコマンドの実行を抑制したり全然違う代替コマンドに変えたりもできるかと, やりすぎると収集つかなくなるかもですが…

Comments (0):