![/ tmpファイルの生成を監視し、ファイルの削除を防ぎますか? [コピー]](https://linux33.com/image/84371/%2F%20tmp%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%94%9F%E6%88%90%E3%82%92%E7%9B%A3%E8%A6%96%E3%81%97%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%89%8A%E9%99%A4%E3%82%92%E9%98%B2%E3%81%8E%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
/tmp/*some folder*
いくつかのファイルを作成して実行するバイナリがあります。同じバイナリは、これらのファイルを実行した直後に削除します。これらのファイルをブロックする方法はありますか?
バイナリファイルには書き込み権限が必要なため、フォルダを読み取り専用にすることはできません。実行時にファイルをコピーするか、元のバイナリがファイルを削除するのを防ぐ方法が必要です。
答え1
chattr +a /tmp/*some folder*
フォルダを追加するように設定します。ファイルを作成して書き込むことはできますが、削除することはできません。chattr -a /tmp/*some folder*
完了したら使用してください。
答え2
次のinotifywait
コマンドを使用できますイノティファイツールたとえば、次のように作成された/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
ハードリンクであるため、プログラムが変更された場合は更新する必要がありますが、プログラムが削除されるときは削除しないでください。ハードリンククローンは正常に削除できます。
この方法はアトミックではないため、プログラムが新しく作成したファイルを削除する前に、このスクリプトを使用してハードリンクを作成する必要があります。
複製したい場合みんなに変更すると、/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
答え3
/ tmpで実行されたプログラムがまだ実行されている場合、ファイルシステムから「削除」されても、inodeはまだデータと共に存在するため、通常は元のバイナリを取得できます。削除すると、単にディレクトリから名前の関連付けが解除されます。
Linuxでは、/proc/PID/exeリンクを介してinodeの内容にアクセスできます。同様のツールを使用する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を使用して(興味のあるプログラムのPIDを見つけたら、興味のあるプログラムのPIDを見つけることができますps
)/ procのexeリンクを見て、ファイルの内容をコピーしました(ターゲットファイル名は消えましたが)内容がオリジナルと同じであることを確認しました。
もちろん、/ tmpのプログラムが一時的な場合には機能しません。なぜなら、プログラムが終了すると、inodeのリンク数がデータが実際にディスクから解放されるポイントまで落ちるからです。
/ tmpディレクトリからリンクを解除する前にファイルを急いでコピーするのを防ぎます。