如何防止将rm -rf误认为特定文件夹?


8

我认为这里的很多人都错误地创建rm -rf了错误的目录,并希望它不会造成巨大的损害。是否有任何方法可以防止用户执行类似的unix恐怖故事?有人提到(在上一个链接的评论部分中),

...我很确定,现在使用Unix的所有unix课程或公司都设置rm -fr来禁用尝试运行它的人的帐户或阻止他们运行它的人...

当前的Unix或Linux发行版中是否有任何实现?防止来自系统管理员(具有root用户访问权限)的错误的常见惯例是什么?

在Solaris(自2005年起)和GNU(自2006年起)中,似乎对根目录/)有所保护。无论如何,还有对其他一些文件夹实施相同的保护方法吗?

为了更加清楚起见,我并不是在询问有关rm用法的一般建议(并且我已经更新了标题以表明更多内容),我想要的东西更像是根文件夹保护:为了rm -rf /您必须传递一个特定的参数:rm -rf --no-preserve-root /..是否有针对定制目录集的类似实现?还是可以指定文件,但还/可以通过“ 保留根”选项保护文件?


11
1)变更管理2)备份。
mattdm

6
可能唯一的方法是将rm命令替换为不具有该功能的命令。
Keith 2013年

2
安全-RM也许
SR_

2
大多数发行版都执行“ alias rm ='rm -i”,这使rm询问您是否确定。除此之外:知道你在做什么。仅在必要时成为root。对于具有root特权的任何用户,必须在该用户内或由该用户实现任何类型的安全性。如果您自己做不到,请雇用某人。随着时间的流逝,如果您无法解决问题,那么任何对策都等同于上面的别名行。
Bananguin

1
@amyassin使用rm -rf可以是恢复生成事件。检查和三重检查执行前
midnightsteel

Answers:


15

为避免弄错rm -rf请勿输入rm -rf

如果您需要删除目录树,建议使用以下工作流程:

  • 如有必要,请更改为要删除的目录的父目录。
  • mv directory-to-delete DELETE
  • 探索DELETE并检查是否确实要删除它
  • rm -rf DELETE

切勿rm -rf使用以外的其他参数来调用DELETE。分几个阶段执行删除操作,使您有机会验证自己没有删除错误的内容,可能是因为输入错误(如rm -rf /foo /bar而不是rm -rf /foo/bar),还是由于脑力激荡(哎呀,不,我是想删除foo.old并保留foo.new) 。

如果您的问题是您不能信任其他人不要输入rm -rf,请考虑删除他们的管理员特权。还有很多不对的地方rm


始终进行备份

定期验证您的备份是否有效并且是最新的。

将所有无法轻松下载的内容保存在版本控制下。


在基本的UNIX系统上,如果您真的想通过删除某些目录,请使用拒绝某些参数的自定义脚本rm替换(或更好的阴影)rm。或通过hg rm

一些Unix变体提供了更多可能性。

  • 在OSX上,您可以在目录上设置访问控制列表,以防止删除其中的文件和子目录,而又不阻止创建新条目或修改现有条目:(chmod +a 'group:everyone deny delete_child' somedir这并不防止删除子目录中的文件:如果您也可以在子目录上设置ACL)。
  • 在Linux上,您可以在SELinux,AppArmor或其他禁止rm修改某些目录的安全框架中设置规则。

是的,备份是最令人惊奇的解决方案,但是我正在考虑--no-preserve-root对其他重要文件夹使用类似选项的东西。而且,即使作为一种实践,也显然不存在……
amyassin 2013年

我已编辑问题以表明我想要更多...
amyassin 2013年

1
@amyassin恐怕仅此而已(至少在Linux上没有)。rm -rf已经表示“删除此,是的,我确定我知道自己在做什么”。如果需要更多,请使用rm拒绝删除某些目录的脚本替换。
吉尔(Gilles)'所以

请编辑问题的最后评论,因为我认为它很好地回答了这个问题……
amyassin 2013年

2
@amyassin实际上,我收回了这个。传统Linux上没有其他功能,但是您可以设置Apparmor / SELinux /…规则,以防止rm访问某些目录。另外,由于您的问题不仅是关于Linux的,所以我应该提到OSX,它有点像您想要的东西。
吉尔(Gilles)'所以

4

如果您正在使用rm *zsh和zsh,则可以设置以下选项rmstarwait

setopt rmstarwait

现在,当您使用时,shell会发出警告*

> zsh -f
> setopt rmstarwait
> touch a b c
> rm *
zsh: sure you want to delete all the files in /home/unixuser [yn]? _

当您拒绝它(n)时,什么也不会发生。否则,所有文件将被删除。


有什么zsh -f用?
詹姆斯

3

为了防止rm -rf *目录中的意外,请在该目录中创建一个名为“ -i”的文件(可以使用emacs或其他程序进行此操作)。该外壳程序将尝试解释-i并使它进入交互模式。

例如:您有一个目录rmtest,文件名为-iinside。如果您尝试访问rm目录中的所有内容,rm则将首先-i传递给它,然后进入交互模式。如果您想在目录中放一个这样的文件,可能会有所帮助。

请注意,这对无效rm -rf rmtest


我已编辑问题以表明我想要更多...
amyassin 2013年

很棒的把戏!该文件很容易用> -i
capitano666 '18

2

根据评论建议编辑:

您可以将的属性更改为不可变的文件或目录,然后即使删除该属性也不能由root删除。

chattr +i /some/important/file

这也意味着该文件无论如何都不能被写入或更改,即使是root。显然我还没有使用过的另一个属性是append属性(chattr +a /some/important/file。然后,该文件只能以附加模式打开,这意味着也不能删除,但可以添加到该文件中(例如,日志文件)。这意味着您可以将无法在对其进行编辑vim,例如,但你可以做echo 'this adds a line' >> /some/important/file,使用>,而不是>>将失败。

可以使用减号取消设置这些属性,即 chattr -i file

否则,如果不合适,我的做法是始终ls /some/dir先执行该操作,然后再重新键入该命令,而不要按向上箭头CTL-A,然后删除ls并在rm -rf需要时键入my 。并不是很完美,但是通过查看ls的结果,您可以事先知道它是否是您想要的。


我已编辑问题以表明我想要更多...
amyassin 2013年

2

如果您了解C编程语言,我认为可以重写rm源代码并为内核做一些补丁。我在一台服务器上看到了这一点,无法删除一些重要目录,当您键入“ rm -rf / direcotyr”时,它会向sysadmin发送电子邮件。


1

一种可能的选择是停止使用rm -rf并开始使用rm -rii那里的额外参数是为了确保它询问您是否确定要删除文件。

最好的选择是将别名别名rm -rikill_it_with_fire。这样,只要您想移除某物,就继续用火将其杀死。


1
我喜欢这个名字,但不是f正好相反i吗?我尝试了一下,但是仍然工作了……
amyassin

@amyassin是的。对于某种奇怪的时尚,我以为我只r在那里。修复它。
NlightNFotis

我已编辑问题以表明我想要更多...
amyassin 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.