安全访问inotified文件

时间:2014-05-17 18:29:18

标签: shell inotifywait

在shell脚本中,我想等待某个文件出现

inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do
# Call other programs which process the file like stat or sha1sum
done

我会假设文件在处理代码中有效。可悲的是,文件似乎消失了,例如由sha1sum处理后。 我是否遗漏了一些显而易见的东西,这对于使文件持续存在是必要的?

1 个答案:

答案 0 :(得分:1)

许多进程创建临时文件并快速删除它们。这就是进步的本质。

要防止在循环执行时删除文件,请使用 hard 链接:

inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do
    ln "$FILE" tmpfile$$ || continue
    sha1sum tmpfile$$
    rm tmpfile$$
done

如果文件在while循环开始之前被销毁,那么你无能为力。但是,如果它存在于循环的开头,则只要您需要,使用硬链接将确保它继续存在。

硬链接不会阻止其他进程更改文件。如果这是一个问题,那么副本(cp)是必要的。

为此,临时文件必须与原始文件系统位于同一文件系统上。

如果此应用程序对安全性敏感,您可能需要使用mktemp或其他此类实用程序来生成临时文件的名称。