Val*_*cev 171 linux bash command-line-interface safety rm
我只是rm -rf /*不小心跑了,但我的意思是rm -rf ./*(注意斜线后面的星星)。
alias rm='rm -i'并且--preserve-root在默认情况下不救我,那么,有没有这方面的任何自动进行保护?
我不是 root 并立即取消了该命令,但在某处或某处有一些宽松的权限,因为我注意到我的 Bash 提示已经坏了。我不想依赖权限而不是 root(我可能会犯同样的错误sudo),而且我不想因为系统中某处丢失一个文件而寻找神秘的错误,所以,备份和sudo是好的,但我想要更好的东西来处理这个特定的情况。
关于三思而后行。我实际上正在使用它!但我用它来解决一些涉及 10 种不同事物的复杂编程任务。我深深地沉浸在这个任务中,没有任何脑力来检查标志和路径,我什至不考虑命令和参数,我认为像“空当前目录”这样的动作,我大脑的不同部分将它们转换为命令,有时会出错。我希望计算机纠正它们,至少是危险的。
Sac*_*kar 227
我遵循的技巧之一是#在使用rm命令时放在开头。
root@localhost:~# #rm -rf /
Run Code Online (Sandbox Code Playgroud)
这可以防止rm在错误的文件/目录上意外执行。确认后,#从头开始删除。这个技巧是有效的,因为在 Bash 中,一个以 开头的单词#会导致该单词和该行上所有剩余的字符被忽略。因此该命令被简单地忽略。
或者
如果你想阻止任何重要的目录,还有一个技巧。
创建一个-i在该目录中命名的文件。怎么能创建这样一个奇怪的文件?使用touch -- -i或touch ./-i
现在尝试rm -rf *:
sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1 2 3 4 -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'?
Run Code Online (Sandbox Code Playgroud)
这里*将扩展-i到命令行,因此您的命令最终会变成rm -rf -i. 因此命令会在删除前提示。你可以把这个文件在你的/,/home/,/etc/,等。
或者
使用--preserve-root作为一个选项rm。在rm包含在较新的coreutils软件包中,这个选项是默认的。
--preserve-root
do not remove `/' (default)
Run Code Online (Sandbox Code Playgroud)
或者
使用安全-rm
摘自网站:
Safe-rm 是一种安全工具,旨在通过用包装器替换 /bin/rm 来防止意外删除重要文件,该包装器根据永远不应删除的文件和目录的可配置黑名单检查给定参数。
尝试删除这些受保护文件或目录之一的用户将无法这样做,而是会显示警告消息:
Run Code Online (Sandbox Code Playgroud)$ rm -rf /usr Skipping /usr
Ste*_*ski 52
你的问题:
我只是不小心运行了 rm -rf /* ,但我的意思是 rm -rf ./* (注意斜线后面的星号)。
解决方案:不要这样做!作为练习,不要./在路径的开头使用。斜线对命令没有任何价值,只会引起混淆。
./*意思与 相同*,所以上面的命令最好写成:
rm -rf *
这是一个相关的问题。我经常看到以下表达式,有人认为它FOO设置为类似/home/puppies. 实际上,我今天刚刚在一家主要软件供应商的文档中看到了这一点。
rm -rf $FOO/
但是如果FOO没有设置,这将评估为rm -rf /,这将尝试删除系统上的所有文件。尾部斜杠是不必要的,所以作为练习,不要使用它。
以下将做同样的事情,并且不太可能损坏您的系统:
rm -rf $FOO
我通过艰难的方式学会了这些技巧。14 年前,当我拥有第一个超级用户帐户时,我不小心rm -rf $FOO/从 shell 脚本中运行并破坏了一个系统。其他 4 位系统管理员看着这个说,‘是的。每个人都这样做一次。现在这是您的安装介质(36 张软盘)。去修理它。
这里的其他人推荐解决方案,如--preserve-root和safe-rm。但是,这些解决方案并非适用于所有 Un*xe 变体,并且可能不适用于 Solaris、FreeBSD 和 MacOSX。此外,还safe-rm要求您在使用的每个 Linux 系统上安装其他软件包。如果你依赖safe-rm,当你开始一份新工作而他们没有safe-rm安装时会发生什么?这些工具是一个拐杖,依靠已知的默认值并改善您的工作习惯要好得多。
Not*_*Now 34
由于这是在“Serverfault”上,我想这样说:
如果你有几十个或更多的服务器,有一个庞大的管理员/用户团队,有人会去rm -rf或chown错误的目录。
您应该制定一个计划,以尽可能少的 MTTR 恢复受影响的服务。
Gil*_*il' 24
最好的解决方案是改变你的习惯,不要rm直接使用。
一种方法是先运行echo rm -rf /stuff/with/wildcards*。检查通配符的输出是否合理,然后使用 shell 的历史记录执行不带echo.
另一种方法是将echo命令限制在您将要删除的内容非常明显的情况下。与其删除目录中的所有文件,不如删除该目录并创建一个新目录。一个好的方法是将现有目录重命名为DELETE-foo,然后创建一个foo具有适当权限的新目录,最后删除DELETE-foo. 这种方法的一个附带好处是,在您的历史记录中输入的命令是rm -rf DELETE-foo.
cd ..
mv somedir DELETE-somedir
mkdir somedir # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir # just to make sure we're deleting the right thing
rm -rf DELETE-somedir
Run Code Online (Sandbox Code Playgroud)
如果您真的坚持删除一堆文件,因为您需要保留该目录(因为它必须始终存在,或者因为您没有重新创建它的权限),请将文件移动到其他目录,然后删除该目录.
mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME
Run Code Online (Sandbox Code Playgroud)
(按那个Alt+.键。)
从内部删除目录会很有吸引力,因为rm -rf .它很短,因此打字错误的风险很低。不幸的是,典型的系统不允许您这样做。您可以rm -rf -- "$PWD"改为这样做,但拼写错误的风险更高,但其中大多数会导致不删除任何内容。请注意,这会在您的 shell 历史记录中留下一个危险的命令。
只要有可能,就使用版本控制。你不rm,你cvs rm或其他什么,这是可以撤销的。
Zsh 可以选择在运行之前rm使用列出目录中所有文件的参数来提示您:(rm_star_silent默认情况下打开)在执行之前提示rm whatever/*,以及rm_star_wait(默认情况下关闭)添加 10 秒延迟,在此期间您无法确认。如果您打算删除某个目录中的所有文件,这将是有限的,因为您已经在期待提示了。它可以帮助防止诸如rm foo *for 之类的拼写错误rm foo*。
还有更多涉及更改rm命令的解决方案。这种方法的一个限制是,有一天你会在一台真实的机器上rm,你会自动调用rm,安全地期待确认......接下来你将恢复备份。
Naf*_*Kay 21
正如你提到的,你总是可以做一个别名:
what_the_hell_am_i_thinking() {
echo "Stop." >&2
echo "Seriously." >&2
echo "You almost blew up your computer." >&2
echo 'WHAT WERE YOU THINKING!?!?!' >&2
echo "Please provide an excuse for yourself below: "
read
echo "I'm sorry, that's a pathetic excuse. You're fired."
sleep 2
telnet nyancat.dakko.us
}
alias rm -fr /*="what_the_hell_am_i_thinking"
Run Code Online (Sandbox Code Playgroud)
您还可以将其与命令行 twitter 客户端集成,以提醒您的朋友您rm -fr /*以 root 身份擦除硬盘几乎是如何羞辱自己。
acu*_*ich 17
防止意外的最简单方法rm -rf /*是避免所有使用rm命令!事实上,我一直想跑rm /bin/rm完全摆脱命令!不,我不是在开玩笑。
而是使用命令的-delete选项find,但首先在删除文件之前,我建议预览您将删除的文件:
find | less
Run Code Online (Sandbox Code Playgroud)
请注意,在现代版本中,find如果您省略目录名称,它将隐式使用当前目录,因此上面的内容等效于:
find . | less
Run Code Online (Sandbox Code Playgroud)
一旦您确定这些是您要删除的文件,您就可以添加-delete选项:
find path/to/files -delete
Run Code Online (Sandbox Code Playgroud)
因此,不仅find 使用更安全,而且表现力更强,因此如果您只想删除目录层次结构中与特定模式匹配的某些文件,您可以使用这样的表达式进行预览,然后删除文件:
find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete
Run Code Online (Sandbox Code Playgroud)
find除了更安全之外,还有很多很好的理由来学习和使用rm,所以如果你花时间学习使用find.
eve*_*nti 16
这个帖子中有一些非常糟糕的建议,幸运的是大部分都被否决了。
首先,当你需要成为 root 时,成为 root - sudo 和各种别名技巧会让你变得虚弱。更糟糕的是,他们会让你粗心大意。学会以正确的方式做事,停止依赖别名来保护你。有一天你会在一个没有训练轮的盒子上扎根,然后炸毁一些东西。
其次 - 当你有 root 时,把自己想象成驾驶一辆满是学童的公共汽车。有时你可以在收音机里听着这首歌摇摆不定,但有时你需要左右看,放慢速度,仔细检查你所有的镜子。
第三 - 你几乎从来没有真正需要rm -rf- 更有可能你想要mv something something.bak或mkdir _trash && mv something _trash/
第四 -ls之前总是你的通配符rm- 在永远摧毁某物之前查看它并没有什么疯狂的。
Dav*_*rtz 11
此问题的解决方案是定期备份。任何时候你生产的东西你不想冒失去的风险,备份它。如果您发现定期备份太痛苦,那么请简化该过程,使其不那么痛苦。
例如,如果您处理源代码,请使用诸如git镜像代码并将历史记录保存在另一台机器上的工具。如果您处理文档,请使用脚本将rsync您的文档传输到另一台机器。
Mad*_*ter 11
这是我的标准,专门针对 rm 上下文中的正则表达式,但在这种情况下它会救你。
我总是先做echo foo*/[0-9]*{bar,baz}*,看看正则表达式将匹配什么。获得输出后,我将返回命令行编辑并更改echo为rm -rf. 我从来没有rm -rf在未经测试的 regexp 上使用过。