监视 /tmp 文件创建并防止删除文件?

监视 /tmp 文件创建并防止删除文件?

我有一个二进制文件,可以在其中创建一些文件/tmp/*some folder*并运行它们。同样的二进制文件在运行这些文件后立即删除它们。有什么办法可以拦截这些文件吗?

我无法将该文件夹设置为只读,因为二进制文件需要写入权限。我只需要一种方法来在执行文件时复制文件或阻止原始二进制文件删除它们。

答案1

chattr +a /tmp/*some folder*会将文件夹设置为仅追加。文件可以创建和写入,但不能删除。chattr -a /tmp/*some folder*完成后使用。

答案2

您可以使用以下inotifywait命令inotify 工具在脚本中创建在/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 中删除了该程序。使用我从 shell 获得的 PID(您可以通过 找到您关心的程序的 PID ps)我查看了 /proc 中的 exe 链接,然后复制了文件的内容(即使目标文件名消失了),然后检查内容是否与原件相符。

如果 /tmp 中的程序是短暂的,这当然不起作用,因为一旦它们退出,inode 的链接计数将下降到实际从磁盘释放数据的位置。

它确实避免了在从 /tmp 目录取消链接之前争相复制文件。

相关内容