![安全删除包含未知内容的目录](https://linux22.com/image/937859/%E5%AE%89%E5%85%A8%E5%88%A0%E9%99%A4%E5%8C%85%E5%90%AB%E6%9C%AA%E7%9F%A5%E5%86%85%E5%AE%B9%E7%9A%84%E7%9B%AE%E5%BD%95.png)
我有一个目录 /usr/local/foo,我需要删除它。这将是一个脚本的一部分,需要以 root 身份运行。我主要担心这个包含用户可以编辑的内容的目录可能会包含一些内容,导致简单的“rm -rf /usr/local/foo”意外删除其他内容。例如,如果他们设法将 foo 符号链接到 /dev 或某个地方,然后 rm 跟进。
我想要目录消失了,以及其中的所有内容。这包括用户文件、符号链接和其他所有内容。然而,如果某些恶意用户将 foo 符号链接到 /dev,我希望它不会删除 /dev。
系统:Ubuntu、FreeBSD 和 OSX
答案1
如果/usr/local/foo
可能包含用户文件或您的文件,并且这些文件已被用户修改,请执行以下操作:
为您的脚本提供要删除的文件名列表(/usr/local/foo/{file1,old.txt}
以及检查用户修改的方法。校验和(man md5sum shasum
)或文件修改日期(man stat
)只是您可以使用的众多方法中的两种。使用 的bash
测试[[ -f $filename ]]
来确保您要删除的“文件”是一个文件,而不是链接、子目录或其他任何东西。(man bash
)
删除(man rm
)列表中通过“未修改”测试的文件。
然后,利用rmdir
拒绝删除非空目录 ( man rmdir
)
rmdir /usr/local/foo
忽略错误消息和错误状态。如果/usr/local/foo
为空,则它已消失。如果还有剩余文件,则它未消失。
答案2
我正在寻找的命令是
rm -fr --one-filesystem foo
rm 不遵循符号链接,只会取消链接文件。