有什么方法可以完全防止该命令在终端中被错误执行?例如,我知道 bash 有别名。有办法使用它们吗?
答案1
是的,有很多方法可以避免rm
造成混乱。但是,与其让rm
类似的命令万无一失,不如学会负责任地使用 Unix 系统会更好。
我的建议:
处理危险命令(
rm
、dd
、shred
、eval
等)时要格外小心。除非您完全确定您没有输入错误,否则请不要执行任何操作。
如果您不完全理解给定的命令,请不要执行它。在继续之前先阅读其手册。
进行备份。并备份您的备份。
也就是说,你可以这样做:
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
但我怀疑这个解决方案在主目录上是否可行,因为可能有许多实用程序具有读取权限(例如,您的文件资源管理器)。