Bash的fork bomb以及解决办法
:(){ :|:& };:
上面的代码在CU上看到的,有名的bash fork() bomb。在Bash 里跑这段代码,Linux系统差不多都会死。我在VM里的RHEL5上试着运行后,立即ps看到满屏的bash进程,之后系统就卡住了动不了。没办法,只好强行Reboot。
乍一看这段代码确实不好理解,如果展开来看就清晰多了。
:()
{
:|:&
};
:
{
:|:&
};
:
还是晕晕的?再换一下就更好理解了。
a()
{
a|a&
};
a
{
a|a&
};
a
简化一下,先定义一个函数a,再运行a。a函数里面递归调用自身a,并且利用管道fork一个子bash进程在后台运行a。
于是,运行a的后果是当前的bash陷入a的死循环,不断的fork,而且fork出来的子进程又都做同样的事,这样要不了一会儿,栈空间挂了,进程列表也会挂,系统就要崩溃了。
:(){ :|:& };:这个我刚开始也让我困惑,不知道bash里:可以用做函数名。还有:在bash里是builtin,具体可以info :看到其作用。
有必要了解bash解释命令的顺序
- Aliases
- Keywords such asfunctionand several others, likeifandfor
- Functions
- Built-ins likecdandtype
- Scripts and executable programs, for which the shell searches in the directories listed in thePATH
environment variable bash中函数优先内置命令,于是:被当作函数解释了。
预防 fork bomb的方法就是限制每个用户的进程数,可以在/etc/security/limits.conf里设置。具体用法可以参见该文件的注释部分或者man limits.conf