防止 bash 脚本中出现‘rm -rf /’的最佳实践

防止 bash 脚本中出现‘rm -rf /’的最佳实践

众所周知,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。

相关内容