/tmp/*some folder*
にいくつかのファイルを作成して実行するバイナリがあります。この同じバイナリは、実行後にこれらのファイルを削除します。これらのファイルを傍受する方法はありますか?
バイナリには書き込み権限が必要なため、フォルダを読み取り専用にすることはできません。実行時にファイルをコピーするか、元のバイナリがファイルを削除しないようにする方法が必要です。
スクリプトでinotifywait
コマンドを inotify-tools から使用して、/tmp/some_folder
で作成されたファイルのハードリンクを作成できます。たとえば、作成されたすべてのファイルを/tmp/some_folder
から/tmp/some_folder_bak
にハードリンクします。
#!/bin/sh
ORIG_DIR=/tmp/some_folder
CLONE_DIR=/tmp/some_folder_bak
mkdir -p $CLONE_DIR
inotifywait -mr --format='%w%f' -e create $ORIG_DIR | while read file; do
echo $file
DIR=`dirname "$file"`
mkdir -p "${CLONE_DIR}/${DIR#$ORIG_DIR/}"
cp -rl "$file" "${CLONE_DIR}/${file#$ORIG_DIR/}"
done
これらはハードリンクであるため、プログラムが変更したときに更新する必要がありますが、プログラムが削除したときに削除しないでください。通常、ハードリンクされたクローンを削除できます。
このアプローチはアトミックにはほど遠いことに注意してください。プログラムが新しく作成されたファイルを削除する前に、このスクリプトを使用してハードリンクを作成することに注意してください。
allの変更を/tmp
に複製する場合は、より分散したバージョンのスクリプトを使用できます。
#!/bin/sh
TMP_DIR=/tmp
CLONE_DIR=/tmp/clone
mkdir -p $CLONE_DIR
wait_dir() {
inotifywait -mr --format='%w%f' -e create "$1" 2>/dev/null | while read file; do
echo $file
DIR=`dirname "$file"`
mkdir -p "${CLONE_DIR}/${DIR#$TMP_DIR/}"
cp -rl "$file" "${CLONE_DIR}/${file#$TMP_DIR/}"
done
}
trap "trap - TERM && kill -- -$$" INT TERM EXIT
inotifywait -m --format='%w%f' -e create "$TMP_DIR" | while read file; do
if ! [ -d "$file" ]; then
continue
fi
echo "setting up wait for $file"
wait_dir "$file" &
done
chattr +a /tmp/*some folder*
はフォルダを追加専用に設定します。ファイルの作成と書き込みはできますが、削除はできません。使用する chattr -a /tmp/*some folder*
完了したとき。
/ tmpから実行されたプログラムがまだ実行されている場合は、ファイルシステムから「削除」されていても、通常は元のバイナリを取得できます。これは、inodeがデータとともに存在するためです。削除はディレクトリから名前をリンク解除するだけです。
Linuxでは、/ proc/PID/exeリンクを介してiノードのコンテンツにアクセスできます。 ls
のようなツールを使用すると、元のパスが表示され、リンクが壊れている(色順)とマークされ、リストには名前に「(削除済み)」のようなメッセージが表示されます。ただし、ファイルを読み取ることでそれを取得できます。
この概念を示す例(例示的なツールとしてスリープを使用):
$ cp /bin/sleep /tmp/otherprog
$ /tmp/otherprog 300 &
[1] 3572
$ rm /tmp/otherprog
$ ls -l /proc/3572/exe
lrwxrwxrwx 1 john john 0 Feb 27 08:54 /proc/3572/exe -> /tmp/otherprog (deleted)
$ cp /proc/3572/exe /tmp/saved
$ diff /tmp/saved /bin/sleep
$ echo $?
0
スリーププログラムの内容を「otherprog」という新しいプログラムにコピーして「新しい」プログラムを作成し、しばらく実行し続けるように実行しました。次に、プログラムを/ tmpから削除しました。シェルから取得したPIDを使用して(ps
を介して、気になるプログラムのPIDを見つけることができます)、/ procのexeリンクを確認し、ファイルの内容をコピーしました(ターゲットファイル名前はなくなりました)、内容がオリジナルと一致することを確認しました。
もちろん、/ tmpからのプログラムが短命である場合、これは機能しません。なぜなら、プログラムが終了すると、iノードのリンクカウントは、データが実際にディスクから解放される場所まで低下するからです。
/ tmpディレクトリーからリンク解除される前にファイルをコピーするための競合は回避されます。