危险!
除非您已准备好崩溃和/或强制重新引导系统,否则请不要运行此命令以对其进行“测试”。
我当时在运行12.04的Virtualbox中尝试编译应用程序,而在等待期间,我偶然遇到了一个论坛,其中有一条评论说:
也尝试
:(){ :|: & };:
Fun,并且不需要root。
没想到,我在我的gnome终端中运行了它。它使我的12.04(在Virtualbox中)的延迟非常严重,我不得不将其关闭。
我的问题是该命令的作用是什么?
:(){:|:&} ;:
危险!
除非您已准备好崩溃和/或强制重新引导系统,否则请不要运行此命令以对其进行“测试”。
我当时在运行12.04的Virtualbox中尝试编译应用程序,而在等待期间,我偶然遇到了一个论坛,其中有一条评论说:
也尝试
:(){ :|: & };:
Fun,并且不需要root。
没想到,我在我的gnome终端中运行了它。它使我的12.04(在Virtualbox中)的延迟非常严重,我不得不将其关闭。
我的问题是该命令的作用是什么?
:(){:|:&} ;:
Answers:
这就是所谓的叉子炸弹。
:()
表示您正在定义一个名为 :
{:|: &}
表示运行该函数:
并将其输出:
再次发送到该函数并在后台运行。
的;
是命令分隔符。
:
第一次运行该功能。
本质上,您正在创建一个函数,该函数在每次调用时都会调用两次,并且没有任何方法可以终止自身。在您用尽系统资源之前,它将不断加倍。
在Virtualbox中运行非常明智,否则您将不得不重新启动PC。
;
命令分隔符。该{ ... }
部分只是功能的内容。
|
和&
做的。我了解您已经提供了该函数的功能,但我想知道这两个函数的作用
这是在shell中实现的所谓的前叉炸弹。
来自维基百科:
:(){ :|:& };:
\_/| |||| ||\- ... the function ':', initiating a chain-reaction: each ':' will start two more.
| | |||| |\- Definition ends now, to be able to run ...
| | |||| \- End of function-block
| | |||\- disown the functions (make them a background process), so that the children of a parent
| | ||| will not be killed when the parent gets auto-killed
| | ||\- ... another copy of the ':'-function, which has to be loaded into memory.
| | || So, ':|:' simply loads two copies of the function, whenever ':' is called
| | |\- ... and pipe its output to ...
| | \- Load a copy of the function ':' into memory ...
| \- Begin of function-definition
\- Define the function ':' without any parameters '()' as follows:
该命令是前叉炸弹的知名版本
通过无限分叉一个进程,它会使您的计算机用尽内存。您还可以使用一些保护措施来防止它:
Unix类型的系统通常具有进程限制,由ulimit shell命令或其后继程序setrlimit控制。Linux内核设置并强制执行进程的RLIMIT_NPROC rlimit(“资源限制”)。如果某个进程尝试执行派生,而拥有该进程的用户已经拥有该
RLIMIT_NPROC
进程,则该派生将失败。另外,在Linux或* BSD上,可以编辑pam_limits
配置文件/etc/security/limits.conf
以达到相同的效果。但是,并非所有Linux发行版都pam_limits
默认安装了该模块。