「:(){:|:&} ;:」というコマンドにより、システムが非常に遅くなり、再起動が必要になったのはなぜですか?


286

危険!

システムのクラッシュや強制リブートの準備ができていない限り、このコマンドを実行して「テスト」しないでください。

私はVirtualboxで12.04を実行してアプリをコンパイルしようとしましたが、待っている間にフォーラムで偶然コメントがありました:

:(){ :|: & };:
Funも試してみてください。ルートは必要ありません。

考えずに、私はそれを私のgnome-terminalで実行しました。12.04(Virtualbox内)の遅延がひどく、シャットダウンする必要がありました。

私の質問は、このコマンドは何をするものですか?

:(){:|:&} ;:



1
古いスレッドも参照してください:ubuntuforums.org/showthread.php?t
Paddy Landau



9
「とてもひどい遅れ」はかなり楽観的です。
pstadler

回答:


372

これはフォークボムと呼ばれます。

:() という関数を定義していることを意味します :

{:|: &}関数:を実行し、その出力を:関数に再度送信し、バックグラウンドで実行することを意味します。

;コマンドの区切りです。

: 関数を最初に実行します。

基本的には、呼び出しごとに2回自分自身を呼び出す関数を作成し、自分自身を終了する方法はありません。システムリソースがなくなるまで2倍になります。

Virtualboxでの実行は非常に賢明でした。さもなければ、PCを再起動する必要がありました。


27
この回答は、再起動が唯一の手段であることを示唆しているようです。しかし、実際、このフォーク爆弾は再起動せずに殺すことができ、実際にはいくつかのシステムで適切に動作しないことが観察されています(スポーン制限が適切に設定されているため)。
コンラッドルドルフ

27
実際には、完全な説明のために、これはおそらく;コマンド区切り文字であることに言及する必要があります。{ ... }一部は単に関数の内容です。
からCVn

@MichaelKjörling+1私はあなたのコメントを考慮に入れるまで構文さえ理解しませんでした。
ジャンプネット

1
@SuperMattこの質問がまだ有効かどうかはわかりませんが、とにかく何が何をするのか知りたい|&思いました。あなたが関数の機能を提供したことは理解していますが、これら2つが何をするのか知りたいと思っていました
-Noober

1
@Nooberまだ疑問に思っているなら(私はLinuxの簡潔で不可解なドキュメンテーションのこのブラックホールにいるように)私は知っています!| コマンドの後に置かれるパイプであり、そのコマンド出力を後続のコマンドへの入力として送信します。&は、前のコマンドの新しいスレッドを作成するフォークであり、現在のスレッドに
残りの

179

これは、シェルに実装されたいわゆるフォークボムです。

ウィキペディアから:

:(){ :|:& };:
\_/| |||| ||\- ... 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:

3
それは接線ポイントであり、用語「disown」はオーバーロードされる可能性がありますが、技術的には、バックグラウンドに入れられたプロセスは否認されず、「fg」コマンドで常にフォアグラウンドに移動でき、プロセスは次の場合に終了しますユーザーはログアウトします(ログアウトを実行するために利用できるリソースがまだある場合).... プロセスまたはジョブIDで「disown」を実行しない限り、そして実行するまで。その後、実際には無視されます。ログアウトは終了せず、fgは効果がありません。
ロンド

1
些細な点にすぎませんが、括弧は、bashのようなシェルにパラメーターがないことを意味するものではなく、Cスタイル言語から残された装飾にすぎません。
チャーリーハーディング

75

そのコマンドはフォークボムのよく知られたバージョンです

ウィキペディアからフォーク爆弾写真

プロセスを無限にフォークすることにより、コンピューターのメモリが不足します。それに対して使用できるいくつかの安全対策もあります。

Unixタイプのシステムには、通常、ulimitシェルコマンドまたはその後継であるsetrlimitによって制御されるプロセス制限があります。Linuxカーネルは、プロセスのRLIMIT_NPROC rlimit(「リソース制限」)を設定および実施します。プロセスがforkを実行しようとし、そのプロセスを所有するユーザーがすでにプロセスを所有しているRLIMIT_NPROC場合、forkは失敗します。さらに、Linuxまたは* BSDでは、構成pam_limitsファイル/etc/security/limits.confを同じ効果に編集できます。ただし、Linuxのすべてのディストリビューションにpam_limitsデフォルトでモジュールがインストールされているわけではありません。


18

よると、この :(){ :|: & };:呼ばれています

Forkbombは一種の詩的なウイルス作成者です

...不正な小さなプログラムは、それ自体の複数のコピーを作成するように命令し、連鎖反応を引き起こし、システムのリソースをすぐに使い果たします...

そのため、これを実行しないでください。ループワイズ実行を引き起こし、ラップトップで簡単に加熱する可能性があるため、ハードウェアに損傷を与える可能性があります。

別のリンクは、ここのスクリーンショット説明しています。


59
フォーク爆弾がハードウェアの損傷を引き起こす場合、より大きな、より深い問題を抱えています。
CVn

38
たぶん彼はあなたのPCの近くで爆​​発することができるフォークの形をした爆弾について話していたのでしょうか?
ディソコ

2
スクリーンショットのリンクが壊れています。
IMustBeSomeone

0

上で説明したように、「fork-bomb」と呼ばれ、これを行う別の方法は、パイピングではなくバックグラウンド実行を使用することです。

:(){ :&:;};:
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.