我打算清理一个充满写保护目录的目录,因此我提升到 root 权限,而不是运行 rm -rf * /,而是运行 rm -rf /*。您可以猜到发生了什么。
有没有什么办法可以预防这种情况?
答案1
为了解决这个问题,您需要创建 2 个简单的 bash 脚本,最好将它们放入/usr/local/bin
。我将它们命名为rm.sh
和sudo.sh
。
然后在你的.bashrc
文件中添加两行:
alias rm='/usr/local/bin/rm.sh'
alias sudo='/usr/local/bin/sudo.sh'
rm.sh
:
#!/bin/bash
a=`echo $1`
b=`echo $2`
c=`echo "$a" | sed -e 's/^\(.\{1\}\).*/\1/'`
d=`echo "$b" | sed -e 's/^\(.\{1\}\).*/\1/'`
if [ "$c" = "/" ] || [ "$d" = "/" ]; then
if [ "$c" = "/" ]; then
echo "You can't erase from $c"
elif [ "$d" = "/" ]; then
echo "You can't erase from $d"
fi
else rm $1 $2
fi
exit 0
该脚本设置了 2 个变量a
,b
第一个是rm
-command 的第一个参数 - 可以是文件、目录或标志。第二个参数是文件或目录。
变量c
和被设置为两个变量和d
的第一个字符。a
b
if 语句测试 或 是否c
等同d
于/
。如果等同,则意味着rm
-command 正在尝试直接从 root 中删除某些内容,而此脚本禁止这样做。
因此脚本会回显“您无法从 / 中删除”
如果需要从中删除/
,则注释掉其中的行.bashrc
并再次引用。
.bashrc
如果您自己以及.bashrc
root 用户都设置了别名,这将阻止/
您自己和 root 用户进行删除。
但是,如果使用 调用该命令,它将不起作用sudo
。因此需要另一个脚本。
sudo.sh
:
#!/bin/bash
a=`echo $1`
if [ $a = "rm" ]; then
echo "You can't run the rm command with sudo due to risks for accidental erasure."
else
sudo $1 $2 $3
fi
exit 0
当sudo
使用 时,将调用此脚本。它唯一检查的是第一个参数是否为rm
-,从而禁止使用sudo rm <whatever>
。这样做时,它会回显“由于意外删除的风险,您无法使用 sudo 运行 rm 命令。”如果不使用sudo
命令rm
,sudo <command> <arg1> <arg2>
将被接受。
如果需要使用 root 权限删除某些内容,则运行sudo su
,以 root 身份删除它(但不能从中删除/
),然后退出并返回到普通用户。
另一个细节是让它更加健壮。在根目录中列出目录时,在绝对顶部添加一个虚假目录。
在许多系统中,当在 / 处运行 ls -la 时,它从顶部的 /bin 开始。
创建目录
/aaa
然后以 root 身份运行
rm -rf *
, 剧本rm.sh将被调用,并且由于参数中没有“/”,因此它将被执行。
然而只有作为“马币 1 美元 2 美元“。
rm -rf * at /
然后就会展开为
/aaa /bin /boot (and so on).
那么唯一真正被删除的目录就是虚假目录/aaa(因为这等于 3 美元)。
答案2
首先:恭喜你,你的职业生涯已经很顺利了(这是在 Unix 中发生的事情,因为我们更愿意用功能来换取易用性)。
从战略角度回答你的问题:是的。从短期角度看:可能吗?
短期:
你可以完全用更谨慎的包装器来替换“rm”命令。我强烈推荐反对但是,不要创建您自己的“sudo”版本;请使用 /etc/sudoers 文件来配置 sudo。它为您提供了足够的控制权来执行您想要执行的操作。这需要一点学习,但从长远来看,每一分钟都是值得的。我强烈建议一般使用 sudo 而不是 su。
请记住,虽然这是 Unix 管理员痴迷于备份的第一个典型重大错误/触发因素,但它远非您可能犯下的唯一重大错误。我能想到的第一个其他例子是“chmod”和“chown”,这些程序会在很短的时间内以递归方式让您的生活变得痛苦不堪。
从根本上说,您想要使用 sudo 并不是因为它提供了更好的审计功能(尤其是在多用户环境中),而是因为它为在系统上使用几乎无限的权限进行操作提供了一点点摩擦,并且能够在您做一些疯狂的事情之前尝试过滤(使用 sudoers)。
长期来看:
从战略角度来看,您可能需要使用一个 shell,要么完全拒绝使用通配符(有时有点难用),要么在执行操作之前与您进行更详细的沟通。遗憾的是,我一个都不知道。
在运行“sudo”命令之前,执行“sudo”会触发文件系统快照,这也很有趣。虽然这不是完美的,但肯定有帮助。