Команда Bash:() {: |: &};: будет порождать процессы до смерти ядра. Можете ли вы объяснить синтаксис?

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

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

Но почему? То, что я больше ощущаю, это двоеточия.

[email protected]$ :(){ :|:& };:

Ответ 1

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

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

Написанный в plain C, который есть:

while(1) {
    fork();
}

Ответ 2

:(){ :|:& };:

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

С разрывами строк:

:()
{
    :|:&
};
:

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

forkbomb()
{
    forkbomb | forkbomb &
};
forkbomb

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

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

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

* hard nproc 50

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

Ответ 3

У меня были разные эффекты при попытке этого. В зависимости (я полагаю) от настроенного верхнего предела для количества процессов и мощности ЦП, это вызвало едва ли удар по некоторым системам, полностью заморозив другие.