在bash脚本中防止“rm -rf /”的最佳实践

众所周知的事实是env.variable中的额外空间会导致在bash脚本中删除/目录。

#!/bin/bash ... rm -rf /$MYPATH 

如果$ MYPATH包含“dir”“dir /”等值,则会导致“rm -rf / dir”“rm -rf dir /” 。 并将导致“rm -rf /”

有什么最好的做法来防止这种情况?

别名rm ='rm --preserve-root'

IIRC –preserve-root是更新版本的coreutils的默认设置。

总是引用你的论点。 即使你知道他们是理智的,但是用脚本引用他们几乎都不会感到痛苦。

rm -rf "/$FOO"不会删除/如果$ FOO有一个前导空间,而不是删除任何东西。 这确实需要引用rm -rf ,当然, 不是这样的:

 TODEL="/$FOO" rm -rf $TODEL 

如果你这样做,你会回来的麻烦。

另外,我倾向于认为一个好的醇':

 if [ -d "/$FOO" ] ; then ... fi 

(或者,如果它只是一个文件)在删除任何东西之前总是一个好主意。

首先要做的是备份。 🙂

但是,当我把那些潜在危险的脚本破解的时候,我总是首先回应危险的线条,所以我可以看到会发生什么。

您还可以将名为-i的文件添加到重要的目录中,因此在某些情况下,rm会在尝试删除这些文件时提示。 当然,如果你通过其他方法来删除,比如Perl脚本或者甚至是不同的rm参数,那也没用。

也可以用chattr +i设置不可变的标志为重要的文件和目录,但要小心。 这可以咬你,如果你实际上应该从某个目录中删除文件或修改文件…

避免这个问题的一个方法是使用一个操作系统来阻止这样的命令在devise上取得成功,因为它可以说是不符合POSIX的。 它是由Solaris 10(2005)发起的,随后是BSD,然后是2006年的Gnu rm。

理智先检查你的代码。 说真的,任何人都会告诉你的东西只是你的代码中应该检查$ MYPATH的值的检查。 如果脚本以交互方式运行,则可以删除-f。

在执行rm命令之前,可以修剪MYPATHvariables。 只要使用回声:

 MYPATH=`echo $MYPATH` 

多年前在一个Ultrix盒子上出现了一个令人尴尬的事件,在那里我以root userdel -r sccs了一个userdel -r sccs (或者相当于Ultrix,已经很长时间了),而没有事先检查sccs用户的主目录,sccs用户的$ HOME原来是/,并且文件系统消失了,我已经避免了将rm -rf $ANYTHING放在脚本中。 你可以检查这个variables,直到你变成蓝色,但是我倾向于打印出一个信息,比如“如果你对这个想法感到满意,现在你应该运行sudo rm -rf $ANYTHING ”。

您可以通过sed传递MYPATH,并检查您input的内容是否与您输出的相同

 MYPATH1=`echo "$MYPATH" | sed -e 's|[ \t]\/[ \t]| |' -e 's|^/[ \t]| |' -e 's|[ \t]/$| |' ` if [ "$MYPATH" != "$MYPATH1" ] then dosomething fi 

通过采取相对path并把它变成绝对path,你在这里做了一件非常有趣的事情。 把给定的path作为给定的path来处理是完成你想要的任务的一个好的开始,但是要接受其他评论者的build议,并且肯定地引用所有的东西。