Bash 命令 :(){ :|:& };: 将产生导致内核死亡的进程。您能解释一下语法吗?
- 2024-10-21 09:14:00
- admin 原创
- 93
问题描述:
我看了这个页面但不明白它是如何工作的。
此命令“以指数方式产生子进程,直到您的机器锁定”。
但为什么呢?我不太理解的是冒号。
user@host$ :(){ :|:& };:
解决方案 1:
:(){ :|:& };:
..定义一个名为的函数:
,该函数会自我生成(两次,一次通过管道传入另一个),并自行在后台运行。
带换行符:
:()
{
:|:&
};
:
将:
函数重命名为forkbomb
:
forkbomb()
{
forkbomb | forkbomb &
};
forkbomb
ulimit
您可以通过限制每个用户的进程数来防止此类攻击:
$ ulimit -u 50
$ :(){ :|:& };:
-bash: fork: Resource temporarily unavailable
$
更永久地,你可以使用/etc/security/limits.conf
(至少在 Debian 和其他版本上),例如:
* hard nproc 50
当然,这意味着您只能运行 50 个进程,您可能需要根据机器的运行情况来增加这个数量!
解决方案 2:
定义了一个函数, :
该函数调用自身两次(代码: | :
:)。它在后台执行此操作(&
)。;
函数定义完成后,该函数:
开始运行。
因此,每个 : 实例都会开始两个新的 : 等等... 就像进程的二叉树一样...
用普通的 C 语言编写而成:
fork();
fork();
解决方案 3:
补充一下上面的答案,pipe 的行为|
是同时创建两个进程并将它们连接起来pipe
(pipe 由操作系统本身实现),因此当我们使用 pipe 时,每个父进程都会生成另外两个进程,这会导致系统资源的利用率呈指数级增长,从而导致资源消耗得更快。
还&
用于将进程置于后台,在这种情况下会立即提示返回,以便下一个调用执行得更快。结论::更快地使用系统资源(呈指数增长):将进程置于后台以更快地启动进程
|
&
解决方案 4:
这定义了一个名为:
( :()
) 的函数。在函数 ( {...}
) 内部,有一个:|:&
如下所示的内容:
:
再次调用该:
函数。|
表示将输出通过管道传输到命令。:
after|
表示管道传输到函数:
。&
,在这种情况下,意味着在后台运行上述操作。
然后有一个;
被称为命令分隔符的东西。
最后,:
开始这种“连锁反应”,激活叉子炸弹。
C 语言的等价形式为:
#include <sys/types.h>
#include <unistd.h>
int main()
{
fork();
fork();
}
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件