Shell 安全访问未加密的文件

Shell 安全访问未加密的文件,shell,inotifywait,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处理后。 我是否错过了一些明显

在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
处理后。
我是否错过了一些明显的东西,这是使文件持续的必要条件?

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

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

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

与的硬链接不会阻止其他进程更改文件。如果这是一个问题,则需要一份副本(
cp

要使其工作,临时文件必须与原始文件位于同一文件系统上


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

因此
inotifywait
必须返回文件的路径和inode才能安全地工作!?如果在inotifywait脚本有机会运行之前文件已经被删除,那么使用inode仍然不能解决问题。正确,但是我会假设inode被reffed(由inotify)直到调用inotify的所有回调为止。
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