/ tmpファイルの生成を監視し、ファイルの削除を防ぎますか? [コピー]

/ tmpファイルの生成を監視し、ファイルの削除を防ぎますか? [コピー]

/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ディレクトリからリンクを解除する前にファイルを急いでコピーするのを防ぎます。

関連情報