别名"rm -rf /"="echo 'idiot'"为什么不起作用?

3

我曾想过,如果“别名(alias)”的名称包含带参数的命令会怎么样呢?我尝试了以下操作:

alias "rm -rf /"="echo 'idiot'"

但它不起作用; 请问正确的方法是什么呢?


1
你必须像这样调用它 "rm -rf /" whatever 或类似的方式才能使其工作,但这种情况下你绝对应该得到警告信息。小心使用 rm 的保护函数或别名;有一天你会发现自己没有安全网,然后犯一个错误,真的很痛苦。如果你想要不同的行为,编写并使用你自己的 deldeleteremove 命令(函数、别名),以你认为合适的方式来保护自己。如果你尝试在缺少你自定义代码的机器上使用它,你仍然会受到保护(命令将无法找到)。 - Jonathan Leffler
2个回答

7
您可以这样做:
rm() {
  if [ "$1" = "-rf" ] && [ "$2" = "/" ]; then
    echo 'idiot'
  else
    command rm "$@"
  fi
}

当然,它不适用于所有情况,但如果您想要,您可以修改此脚本。

1
有关何时使用“别名(alias)”和何时使用“函数(function)”的更多背景信息,请参见http://unix.stackexchange.com/questions/30925/in-bash-when-to-alias-when-to-script-and-when-to-write-a-function。 - Ned Deily

4
虽然有人尝试过,但没有真正好的方法来防止使用 rm -rf / 命令。别名或函数的名称必须是单个标识符。rm -rf / 被解析为一个带有两个参数(-rf 和 /)的 rm 命令。此时,shell 无法将其与任何其他 rm 命令区分开来。在某些系统上,用户启动脚本默认配置为将 rm 别名设置为 rm -i,当然您也可以自行设置,但由于 -f 选项会覆盖 -i 选项,因此在这种情况下无济于事。tcsh shell 具有一个配置 shell 变量 $rmstar,它使其能够将带有 * 通配符的 rm 命令作为参数进行识别;如果设置了该变量,则 shell 在执行命令之前提示用户确认。当您意外输入 rm * .o 而不是 rm *.o 时,它非常有用。但它无法捕捉 rm -rf /,因为没有通配符。(而且如果您不使用 tcsh,它也无济于事。)请注意,这只能在 shell 自身中完成;rm 命令或任何替代品都看不到 * 通配符,它只看到文件名列表。您可以使用防止危险操作的命令替换 rm 命令。但是,任何 rm 命令都有潜在危险。您可以编写一个 rm 包装脚本,在执行任何操作之前始终提示确认,并将其放在 $HOME/bin 中,但是这样您很快就会养成忽略提示的习惯。您可以使用将指定的文件和/或目录移动到某种“垃圾桶”中的命令替换 rm 命令,从中您可以轻松恢复它们。但我经常需要运行 rm -rf some-directory 来释放磁盘空间。同样,这对于 rm -rf / 也没有帮助;那将删除垃圾桶目录,即使移动系统文件也可能会让您的一天毁掉。查找特定命令行选项的解决方案受到限制。仅检查 rm -rf / 不会捕捉到 rm -fr /、rm --force --recursive / 或 rm -rf /etc,后者几乎与 rm -rf / 一样危险。
任何修改rm命令行为的调整都仅在可用该调整时有效。如果您设法使rm命令在自己的环境中更安全,那么您会依赖它,这可能会让您在另一个环境中变得不够谨慎(比如在您没有完全设置好账户的机器上或者因某种原因使用其他账户时)。
解决方案是养成良好的习惯。
  • 备份数据,并确保您能够从备份中恢复文件。(我自己在这方面做得不太好。)
  • 尽可能少地使用root帐户。非root用户运行rm -rf /将造成的损害要比root小得多。(我不确定非root用户运行rm -rf /会发生什么;我不会测试以找出答案。)使用sudo来运行单个命令,而不是作为root运行shell。
  • rm看作是一条危险的命令。如果您输入了一个rm命令,在按Enter之前请重新阅读您所输入的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接