![防止 bash 脚本中出现‘rm -rf /’的最佳实践](https://linux22.com/image/529734/%E9%98%B2%E6%AD%A2%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%87%BA%E7%8E%B0%E2%80%98rm%20-rf%20%2F%E2%80%99%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.png)
众所周知,env.variable 中的额外空间可能会导致 bash 脚本中删除 / 目录。
#!/bin/bash
...
rm -rf /$MYPATH
如果 $MYPATH 包含如下值“目录”或者“目录/”这将导致“rm -rf / 目录”或者“rm -rf 目录 /”. 并将导致“rm-rf/”
是否有任何最佳做法可以防止这种情况发生?
答案1
别名 rm='rm --preserve-root'
IIRC --preserve-root 是较新版本 coreutils 中的默认设置。
答案2
总是引用你的论点。即使你知道它们是合理的,几乎在脚本中引用它们绝不会有什么坏处。
rm -rf "/$FOO"
rm -rf
如果 $FOO 前面有一个空格,则不会删除 /,相反,您不会删除任何内容。当然,这要求引号出现在行上,不是就像是:
TODEL="/$FOO"
rm -rf $TODEL
如果你那,你就会再次陷入一大堆麻烦之中。
此外,我倾向于认为:
if [ -d "/$FOO" ] ; then
...
fi
(或者-e
如果它只是一个文件)在删除任何东西之前总是一个好主意。
答案3
首先要做的事情:备份。:-)
但是,当我破解那些具有潜在危险的脚本时,我总是首先回应那些危险的行,这样我就能看到会发生什么。
您还可以添加一个名为-i
重要目录的文件,因此在某些情况下,rm 会在尝试删除这些目录时提示。当然,如果您通过其他方法(例如 Perl 脚本或甚至使用不同的 rm 参数)进行删除,则不会有帮助。
也可以设置不可变的标记重要文件和目录chattr +i
,但要小心。如果你真的应该从某些目录中删除文件或修改文件...
答案4
首先对您的代码进行健全性检查。说真的,任何人告诉您的任何事情都只是相当于您应该在代码中检查 $MYPATH 的值。如果脚本以交互方式运行,您可以删除 -f。