如何防止“rm -rf ~”被误执行?

如何防止“rm -rf ~”被误执行?

有什么方法可以完全防止该命令在终端中被错误执行?例如,我知道 bash 有别名。有办法使用它们吗?

答案1

是的,有很多方法可以避免rm造成混乱。但是,与其让rm类似的命令万无一失,不如学会负责任地使用 Unix 系统会更好。

我的建议:

  • 处理危险命令(rmddshredeval等)时要格外小心。

  • 除非您完全确定您没有输入错误,否则请不要执行任何操作。

  • 如果您不完全理解给定的命令,请不要执行它。在继续之前先阅读其手册。

  • 进行备份。并备份您的备份。


也就是说,你可以这样做:

alias rm='rm -i'
rm() { command rm -i "${@}"; }

如果您通过该选项,它不会保护您-f,但它适用于简单的情况:

$ rm file
rm: remove regular file 'file'? y

或者您可以编写一个更复杂的包装器。

这种方法的最大问题是您可能会习惯这种非标准行为,如果您需要在没有此类别名/函数/包装器的系统上工作,这可能非常危险。

答案2

正如所要求的,这个包装函数将防止该用户犯一种特定类型的错误:

function rm {
  if [ "$#" -eq 2 ] && [ "$1" = "-rf" ] && [ "$2" = "$HOME" ]
  then
    echo Avoiding a dangerous command...
    return
  else
    command rm "$@"
  fi
}

...因为 bash 将替换rm -rf ~rm -rf $HOME, 如果 $HOME 已设置(否则为用户的主目录)。

这个会不是不过,可以防止很多错误。您可以扩大测试范围以循环遍历参数并检查每个参数是否是 的子集$HOME,或者您想要小心的任何内容。

这不会保护用户执行rm -rf ./*\rm -rf ~sudo rm -rf ~或一大堆其他变体。

答案3

您可以使用的技巧:删除对要保护的目录的权限。这可以防止显式或隐式列出目录内容,而这必须由您未向其提供特定子文件或目录的任何命令来完成。当您指定子级的名称时,您只需要目录遍历权限(标志execute),因此您仍然可以访问受保护目录下的所有内容。

一个快速演示:

# Create the directory, remove its 'read' flag
**$ mkdir protected && chmod -r protected && ls -ald protected
d-wx--x--x 2 me me 4096 Dec  7 21:58 protected

# You cannot list contents since you cannot read it
**$ ls protected
ls: cannot open directory 'protected': Permission denied

# You can create files in it since you have write permission
**$ touch protected/{1..3}

# You can list specific directories entries
**$ ls -al protected/1
-rw-r--r-- 1 me me 0 Dec  7 21:59 protected/1

# You can also create subdirectories
**$ mkdir protected/subdir

# ... and create files in them
**$ touch protected/subdir/{1..3}

# ... do wilcard listing of these subdirectories
**$ ls -al protected/subdir
total 8
drwxr-xr-x 2 me me 4096 Dec  7 21:59 .
d-wx--x--x 3 me me 4096 Dec  7 21:59 ..
-rw-r--r-- 1 me me    0 Dec  7 21:59 1
-rw-r--r-- 1 me me    0 Dec  7 21:59 2
-rw-r--r-- 1 me me    0 Dec  7 21:59 3

# You can erase files, along as you specify them explicitly
**$ rm protected/{1..3}

# You cannot do a blanket erase, since it would require reading the directory
**$ rm -rf protected
rm: cannot remove 'protected': Permission denied

# ... but that works on its subdirectories
**$ rm -rf protected/subdir

# You can still remove the directory once it is empty
**$ rmdir protected

但我怀疑这个解决方案在主目录上是否可行,因为可能有许多实用程序具有读取权限(例如,您的文件资源管理器)。

相关内容