web-dev-qa-db-ja.com

/ tmpでファイルの作成を監視し、ファイルの削除を防止しますか?

/tmp/*some folder*にいくつかのファイルを作成して実行するバイナリがあります。この同じバイナリは、実行後にこれらのファイルを削除します。これらのファイルを傍受する方法はありますか?

バイナリには書き込み権限が必要なため、フォルダを読み取り専用にすることはできません。実行時にファイルをコピーするか、元のバイナリがファイルを削除しないようにする方法が必要です。

9
dragostis

スクリプトで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
8
Matt Vollrath

chattr +a /tmp/*some folder*はフォルダを追加専用に設定します。ファイルの作成と書き込みはできますが、削除はできません。使用する chattr -a /tmp/*some folder*完了したとき。

9
doneal24

/ 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ディレクトリーからリンク解除される前にファイルをコピーするための競合は回避されます。

1
John O'M.