Команда Bash: () {: |: &} ;: порождает процессы до смерти ядра. Можете ли вы объяснить синтаксис? - PullRequest
36 голосов
/ 05 февраля 2009

Я наткнулся на эту страницу и не могу понять, как это работает.

Эта команда "экспоненциально порождает подпроцессы, пока ваш ящик не заблокируется".

Но почему? Чего я меньше лажу, так это двоеточия.

user@host$ :(){ :|:& };:

Ответы [ 2 ]

79 голосов
/ 05 февраля 2009
:(){ :|:& };:

.. определяет функцию с именем :, которая порождает себя (дважды, один канал в другой) и сама фоны.

С переносами строк:

:()
{
    :|:&
};
:

Переименование функции : в forkbomb:

forkbomb()
{
    forkbomb | forkbomb &
};
forkbomb

Вы можете предотвратить такие атаки, используя ulimit, чтобы ограничить количество процессов на пользователя:

$ ulimit -u 50
$ :(){ :|:& };:
-bash: fork: Resource temporarily unavailable
$

Более постоянно, вы можете использовать /etc/security/limits.conf (по крайней мере, в Debian и других), например:

* hard nproc 50

Конечно, это означает, что вы можете запустить только 50 процессов, вы можете увеличить это в зависимости от того, что делает машина!

64 голосов
/ 05 февраля 2009

Определяет функцию с именем :, которая вызывает себя дважды (код: : | :). Это происходит в фоновом режиме (&). После ; определение функции завершено, и функция : запускается.

Таким образом, каждый экземпляр: запускает два новых: и так далее ... Как двоичное дерево процессов ...

Написано простым C, что:

while(1) {
    fork();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...