Почему команда «: () {: |: &} ;:» заставила мою систему зависать так сильно, что мне пришлось перезагрузиться?

286

ОПАСНОСТЬ!

Не запускайте эту команду, чтобы «протестировать» ее, если вы не готовы к сбою и / или принудительной перезагрузке системы.

Я был в моей Virtualbox под управлением 12.04, пытаясь скомпилировать приложение, и во время ожидания я случайно наткнулся на форум, где комментарий гласил:

Попробуйте :(){ :|: & };:
Fun, и вам не нужен root.

Недолго думая, я запустил его в своем терминале гномов. Из-за этого мой 12.04 (в Virtualbox) завис так сильно, что пришлось его выключить.

Мой вопрос в том, что делает эта команда?

: () {: |: &} ;:

blade19899
источник
36
связанный Как защитить Ubuntu от вилки бомбы
Sathyajith Бхат
1
Также смотрите старую ветку
Пэдди Ландау
возможный межсайтовый дубликат: stackoverflow.com/questions/515844/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
9
«так сильно отстает» довольно оптимистично.
pstadler

Ответы:

372

Это называется вилочной бомбой .

:() означает, что вы определяете функцию под названием :

{:|: &}означает запустить функцию :и :снова отправить ее вывод в функцию и запустить ее в фоновом режиме.

Это ;разделитель команд.

: запускает функцию в первый раз.

По сути, вы создаете функцию, которая вызывает себя дважды при каждом вызове и не имеет возможности завершить себя. Он будет удваиваться, пока у вас не закончатся системные ресурсы.

Запуск в Virtualbox был довольно разумным, иначе вам пришлось бы перезагрузить компьютер.

SuperMatt
источник
27
Этот ответ, кажется, предполагает, что перезагрузка является единственным выходом. Но на самом деле эту вилочную бомбу можно убить без перезагрузки, и я действительно заметил, что она все равно не работает должным образом на некоторых системах (потому что их предел порождения установлен разумно).
Конрад Рудольф
27
На самом деле, для полного объяснения следует упомянуть, что ;это разделитель команд. { ... }Часть просто содержание функции.
CVn
@ MichaelKjörling +1 Я даже не понял синтаксис, пока не учел ваши комментарии.
Jumpnett
1
@ SuperMatt Я не знаю, если этот вопрос все еще активен, но в любом случае я хотел знать, что делает |и &делает. Я понимаю, что вы предоставили работу функции, но я хотел знать, что делают эти двое
Нубер
1
@Noober, если вам все еще интересно (как я в этой черной дыре краткой и загадочной документации, которая является Linux), я знаю! | это канал, который ставится после команды для отправки этих команд в качестве входных данных для следующей команды. & является форком, он создает новый поток для предыдущей команды, оставляя текущий поток для продолжения выполнения большего количества команд
flurbius
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
Хотя это тангенциальная точка и термин «отречься» может быть перегружен, технически процесс, помещенный в фоновый режим, не отменяется и всегда может быть выведен на передний план с помощью команды «fg», и процесс (ы) завершится, если пользователь выходит из системы (если есть еще ресурсы для выполнения выхода из системы) .... если и пока один из пробегов «откреститься» на процессе или JobID. После этого он действительно отвергается: выход из системы не прекращается и fg не действует.
Рондо
1
Хотя это лишь второстепенный вопрос, круглые скобки не означают, что в bash-подобных оболочках нет никаких параметров, они являются лишь украшением, оставшимся от языков в стиле C.
Чарли Хардинг
75

Эта команда является хорошо известной версией вилочной бомбы.

Пикап бомба рис из Википедии

Это заставляет ваш компьютер исчерпать память, бесконечно разветвляя процесс. Существуют некоторые меры предосторожности, которые вы можете использовать против него:

Системы типа Unix обычно имеют ограничение процесса, управляемое командой оболочки ulimit или ее преемником setrlimit. Ядра Linux устанавливают и применяют ограничение RLIMIT_NPROC («ограничение ресурсов») процесса. Если процесс пытается выполнить ответвление, а пользователь, которому принадлежит этот процесс, уже владеет RLIMIT_NPROCпроцессами, то ответвление завершается неудачно. Кроме того, в Linux или * BSD можно отредактировать pam_limitsфайл конфигурации /etc/security/limits.confс тем же эффектом. Однако не во всех дистрибутивах Linux pam_limitsмодуль установлен по умолчанию.

Nemo
источник
18

По этому :(){ :|: & };: называется

Forkbomb - это своего рода создатель поэтического вируса

... Коварная маленькая программа приказывает сделать несколько копий себя, вызывая цепную реакцию и, таким образом, быстро истощая ресурсы системы ...

Поэтому рекомендуется не запускать это, это может привести к повреждению оборудования, поскольку оно вызывает циклическое выполнение, может легко вызвать нагрев в ноутбуках.

Другая ссылка объясняет снимки экрана здесь .

atenz
источник
59
Если вилочная бомба приводит к повреждению оборудования , то у вас гораздо большая проблема.
CVn
38
Может быть, он говорил о бомбе в форме вилки, которая может взорваться возле вашего компьютера?
Диско
2
Ссылка на скриншот не работает.
IMustBeSomeone
0

Как описано выше, она называется « бомба-вилка », и еще один способ сделать это - использовать фоновое выполнение, а не трубопровод:

:(){ :&:;};:
karlsebal
источник