众所周知的事实是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命令之前,可以修剪MYPATH
variables。 只要使用回声:
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议,并且肯定地引用所有的东西。