9 个邪恶的 Bash 命令详解
我还记得第一次使用和理解终端时的感受:那种感觉:只需在一个黑色的窗口中输入一些内容,就能访问所有文件、运行所有程序,甚至完全控制整个系统。我也记得随之而来的恐惧,害怕犯错,害怕丢失或毁掉无法挽回的东西。
我并不是一个真正的系统管理员,但多年来,我使用过很多基于 Linux/UNIX 的系统,并且不止一次地发现自己处于这样的境地:我犹豫着是否要按下Enter按键,重新考虑我将要执行的操作。
下面我想分享一些你根本不应该使用,或者至少应该非常谨慎使用的命令。如果你是 Bash 命令新手,我希望你能学到一些新东西。如果你是 Bash 高手,你可以把这篇文章当作练习,在阅读解释之前预测一下结果。
注意:其中一些命令是我自己费了很大劲才学到的,但大多数命令都是我偶尔学到的,例如在这个旧线程中。
在我们开始之前,最后警告:
⚠不要在你关心的系统上运行任何这些命令! ⚠
1. 破坏性目录更改
我决定不从经典的 * 开始,rm -rf /
而是从它的变体开始:
alias cd='rm -rf'
💡 这就是发生的事情
alias
声明 Bash 命令的别名/快捷方式。语法如下:alias alias_name="command_to_run"
cd
是别名,与更改目录命令相同rm -rf
是要运行的命令。它的意思不是“读取邮件,-realfast”,而是“删除指定目录及其所有内容,无需询问”。
因此,如果一个邪恶的人在您离开时将此别名添加到您的开放 bash 中,并且您想要cd
通过您的文件系统,您很快就会注意到一个奇怪的行为......
幸运的是alias
,它只能在当前 shell 会话期间暂时可用,除非它被添加到在终端会话开始时加载的文件之一中,即~/.bashrc
。
🛡 如何预防可能的损害
好吧,只需不要添加此别名,并在添加新别名时仔细检查命令即可。您可以随时使用命令检查哪些别名已存在,alias
并使用 删除别名unalias alias_name
。
为了防止在不知情的情况下删除文件,您可以将以下别名添加到您的~/.bashrc
:
alias rm='rm -i'
这将使你的 bash 在删除某些内容之前总是询问你,即使该rm
命令是作为另一个别名添加的。
* 如果您不知道:这个命令不能再这么简单地执行了——--no-preserve-root
需要一个额外的标志才能在根目录上执行它。
2. 记忆吞噬者
如果您对此表示怀疑,以下是一个有效的 bash 命令:
:(){:|: &};:
💡 这就是发生的事情
简而言之:没有终止条件的递归。定义了一个名为的函数:
。它在定义中两次调用自身。在命令末尾,首先调用该函数。如果我们将其写在单独的几行中并重命名该函数,则会变得更加清晰:
evil () {
evil|evil &
}
evil
如果执行此命令,它会迅速复制自身,耗尽所有内存和 CPU 资源(也称为fork bomb)。它甚至会冻结整个系统,因此是拒绝服务攻击的一个例子。令人惊讶的是,仅用 12 个字节的命令就能执行此类攻击!
🛡 如何预防可能的损害
如果您使用迭代或递归 bash 函数,请务必仔细检查终止条件是否正确,并使用安全的环境进行测试。
由于 fork 炸弹会启动无限数量的进程,因此保护系统的唯一方法是限制本地用户可以运行的进程数量。您可以通过/etc/security/limits.conf
相应地编辑来实现。一个用户可以同时使用大约 200-300 个进程,因此将进程限制在 2000 个左右应该可以保护您的系统免受 fork 炸弹的攻击,而无需对相应用户进行过多限制。
3. 零记忆
dd if=/dev/zero of=/dev/sda
💡 这就是发生的事情
dd
是将数据从一个文件或设备复制到另一个文件或设备的命令if=
指定源,并且/dev/zero
是零字节的无限源of=
指定目标,/dev/sda
是磁盘驱动器或卷
你明白这是怎么回事了吧。这简直是抹掉整个磁盘内容的利器,而且很快就会丢失大量数据。
🛡 如何预防可能的损害
不幸的是,它没有-i
像 那样的标志rm
,所以我唯一的建议是仔细检查你在dd
命令中指定的设备是否真的正确。dd
如果对你来说风险太大,请不要使用该命令。
dd
您可以使用以下别名禁用整个命令:
alias dd='echo "no dd command available"'
如果dd
现在在您的系统上执行该命令,它只会打印出没有可用的 dd 命令。
4. 零恢复
上述命令也可以进行以下变体:
for i in {1..10};do dd if=/dev/urandom of=/dev/sda;done
💡 这就是发生的事情
这会用随机字节覆盖整个磁盘十次,并进一步降低恢复数据的可能性。
🛡 如何预防可能的损害
由于这也是使用dd
命令,请参阅前面第 4 节的建议。
5. 不投入,迷失
git reset --hard
💡 这就是发生的事情
git reset
将 git 存储库的当前 HEAD 重置为上次提交(或指定)的状态--hard
重置索引和工作树。自上次提交以来对工作树中跟踪文件的任何更改都将被丢弃。
换句话说:它会丢弃所有未提交的更改。由于 git 不会跟踪这些更改,因此无法恢复它们。
🛡 如何预防可能的损害
干脆不要使用这个--hard
标志。如果必须使用,请在重置之前仔细检查是否有任何要保留的本地更改。我建议仅在输出为git status
空或您确定要清除所有未提交的数据时才进行硬重置。
6. 压缩拆除
tar -czvf /path/to/file archive.tgz
# instead of
tar -czvf archive.tgz /path/to/file
💡 这就是发生的事情
tar -czvf
是创建新档案的命令,使用gzip,显示所有文件的详细列表并使用给定的档案文件archive.tgz
要创建的档案文件的名称/path/to/file
待压缩文件的路径
这里文件的顺序至关重要。如果第一个文件是你想要压缩的文件,它会被彻底销毁,因为tar
压缩包会覆盖第一个文件来创建存档,但之后才发现第二个文件并不存在。如果你想备份文件,却使用了错误的参数顺序,这种情况尤其令人恼火……
🛡 如何预防可能的损害
您不必将所有标志组合在一起,而是可以分开-f
标志并使用较长的版本来提醒自己,存档文件是哪个文件,例如:
tar -czv --file archive.tgz /path/to/file/to/compress
7. 权利过多
chmod -R 777 /
# instead of
chmod -R 777 ./
💡 这就是发生的事情
chmod -R
递归应用文件权限777
权限模式设置(允许一切)./
应更改的目录或文件
如果您不注意要定位哪个目录并意外地将根目录而不是当前目录作为目标,那么您将弄乱整个系统的所有权限,使其无法再使用。
🛡 如何预防可能的损害
为了防止出现上述拼写错误的结果,可以添加以下别名:
alias chmod='chmod --preserve-root'
这将始终拒绝对根目录进行递归更改。
8. 万恶之源
这同样适用于所有者变更:
chown -R root:root /
# instead of
chown -R root:root ./
💡 这就是发生的事情
chown -R
递归地应用新所有者root:root
所有者:要设置的组./
应更改的目录或文件
这会弄乱所有文件,就像您很可能需要重新安装系统一样。
🛡 如何预防可能的损害
正如我们已经对 所做的那样chmod
,您也可以为 添加以下别名chown
:
alias chown='chown --preserve-root'
在这种情况下,这也将始终拒绝对根目录进行递归更改。
9.加密并销毁
fsck -y /dev/sda
💡 这就是发生的事情
fsck
执行文件系统检查-y
总是尝试自动修复检测到的任何文件系统损坏的标志/dev/sda
要检查的音量
这通常是件好事,除非你的卷已加密。在这种情况下,尝试fsck
修复它会彻底毁掉它。文件系统只有在解锁后才能检查。
🛡 如何预防可能的损害
仅fsck
当您完全确定在正常的未加密卷上使用该命令时才使用它。为防止因尝试自动修复错误而造成的损害,请勿使用该-y
标志。
总结
我们发现,只需输入一个简单的命令就可以非常轻松地破坏数据或使整个系统无法使用。
我发现,最终最好的保护措施是了解你输入的内容,并在执行任何操作之前仔细检查拼写错误!切勿复制粘贴代码——对于 bash 命令尤其如此!还有:务必做好备份。
上述大多数命令都需要 root 权限才能执行。因此,请务必谨慎使用 root 权限执行操作!
如果您知道另一个邪恶的命令,请在下面的评论中与我们分享。
免责声明:对于您尝试上述命令对系统造成的任何损害,我概不负责。请使用虚拟机等安全环境进行测试。我已警告您。
编辑:2019 年 12 月 16 日(🛡 部分用于防止损坏)
发布:2019 年 12 月 10 日
封面图片:https://codepen.io/devmount/full/ExaPBra