递归 shell 脚本是否应该锁定系统?

递归 shell 脚本是否应该锁定系统?

我输入了错误,并递归运行了我的 shell 脚本。示例:

#!/bin/bash
# filename: kill-me-please.sh   
./kill-me-please.sh

这导致我的系统无响应,我所能做的就是硬重启。

在 MacOS 上尝试了同样的方法,它能够检测到这个问题并以错误终止脚本。

我认为操作系统应该能够处理这种情况。这是一个错误吗?

答案1

你们所做的可以称为叉子炸弹。fork 炸弹是一个 shell 脚本,或者是一个单一的 shell 命令,它会递归调用自身,从而占用所有系统资源。这不是一个 bug,而是一个拒绝服务攻击。

每次./kill-me-please.sh执行时,都会创建一个新进程,使用一些内存和时钟周期。您的程序能够创建无数个自身的分叉,但由于系统资源有限,在某个时间点,您将耗尽资源。有许多种分叉炸弹利用了这种可能性。另一个众所周知的例子是:

$ :(){ :|:& };:

:是 shell 函数的名称。在函数中,:在子 shell 中递归调用两次。这将产生与您的脚本相同的效果。

拆除这些 fork 炸弹很难,因为所有资源都可能被 fork 炸弹利用,直到你找到并应用必要的例程。一些恢复方法在这篇维基百科文章

为了防止这种情况,在 Linux 以及其他可能的情况下尤尼塞斯,可以使用ulimit实用程序用于限制用户可以创建的进程数。ulimit -Hu 50将严格限制用户为 50 个进程(因此用户无法更改它)。此外,在许多系统上,都有可用于设置此类限制的配置文件。

您的 OS X 系统很可能已经设置了进程限制。我可以想到其他方法来防止这种情况,但我不能说我的想法是有效的解决方案,也不能说它们被任何操作系统实现,所以我会保留它们。无论如何,可能阅读此帖子的许多人都会想到同样的可能性。

相关内容