Я понимаю, как работает обычная вилочная бомба, но я не совсем понимаю, почему & в конце обычной бомбы вилки требуется и почему эти сценарии ведут себя по-разному:
:(){ (:) | (:) }; :
и
:(){ : | :& }; :
Первый вызывает всплеск использования процессора, а затем возвращает меня к экрану входа. Последнее вместо этого просто заставляет мою систему зависать, заставляя меня сильно перезагрузиться. Это почему? Оба постоянно создают новые процессы, так почему система ведет себя по-разному?
Оба сценария также ведут себя иначе, чем
:(){ : | : }; :
что не вызывает никаких проблем, даже если бы я ожидал, что они будут одинаковыми. Страница руководства bash утверждает, что команды в конвейере уже выполняются в подоболочке, поэтому я уверен, что: | : уже должно хватить. Я верю и должен просто запустить трубопровод в новой оболочке, но почему это так сильно меняется?
Редактировать: Используя htop и ограничивая количество процессов, я смог увидеть, что первый вариант создает реальное дерево процессов, второй вариант создает все процессы на одном уровне, а последний вариант, кажется, не создает никаких процессов. совсем. Это смущает меня еще больше, но, может быть, это как-то помогает?
источник
:(){ : | :; }; :
Ответы:
ПРЕДУПРЕЖДЕНИЕ НЕ ПЫТАЙТЕСЬ ЗАПУСТИТЬ ЭТО НА ПРОИЗВОДСТВЕННОЙ МАШИНЕ. ПРОСТО НЕ. Предупреждение: чтобы попробовать любые «бомбы», убедитесь, что они
ulimit -u
используются. Читайте ниже [а] .Давайте определим функцию для получения PID и даты (времени):
Простая не проблема
bomb
для нового пользователя (защитите себя: прочитайте [a] ):Когда эта функция вызывается для выполнения, работает так:
Команда
date
выполняется, затем выводится «да», режим ожидания в течение 1 секунды, затем команда закрытияdate
и, наконец, функция завершает печать новой командной строки. Ничего фантастического.| труба
Когда мы вызываем функцию следующим образом:
Две команды запускаются через некоторое время, две заканчиваются через 1 секунду, а затем приглашение возвращается.
Это причина того, что труба
|
запускает два процесса параллельно.& фон
Если мы изменим вызов, добавив окончание
&
:Приглашение немедленно возвращается (все действия отправляются в фоновый режим), и обе команды выполняются, как и раньше. Обратите внимание на значение «номера задания»,
[1]
напечатанного перед PID процесса3380
. Позже, тот же номер будет напечатан, чтобы указать, что канал закончился:Это эффект
&
.Это является причиной
&
: чтобы процессы запускались быстрее.Более простое имя
Мы можем создать функцию, вызываемую просто
b
для выполнения двух команд. Набирается в три строки:И выполнено как:
Обратите внимание, что мы не использовали
;
в определенииb
(новые строки использовались для разделения элементов). Тем не менее, для определения в одной строке обычно используется;
, например:Большинство пробелов также не являются обязательными, мы можем написать эквивалент (но менее ясно):
Мы также можем использовать a
&
для разделения}
(и отправки двух процессов в фоновый режим).Бомба.
Если мы заставим функцию кусать свой хвост (вызывая себя), мы получим «ответную бомбу»:
И чтобы он вызывал больше функций быстрее, отправьте канал в фоновый режим.
Если мы добавим первый вызов к функции после обязательного
;
и изменим имя,:
мы получим:Обычно пишется как
:(){ :|:& }; :
Или, написанным в увлекательной игровой форме, под другим именем (снежный человек):
Функция ulimit (которую вы должны были установить перед запуском) заставит приглашение довольно быстро вернуться после множества ошибок (нажмите Enter, когда список ошибок остановится, чтобы получить приглашение).
Причина, по которой это называется «бомба-вилка», заключается в том, что оболочка запускает под-оболочку путем разветвления работающей оболочки и последующего вызова exec () для разветвленного процесса с командой для запуска.
Труба будет "раскошелиться" на два новых процесса. Выполнение этого до бесконечности вызывает бомбу.
Или кролик, как его первоначально называли, потому что он так быстро размножается.
Сроки:
:(){ (:) | (:) }; time :
Прекращено
реальное 0m45.627s
:(){ : | :; }; time :
Прекращено
реальное 0m15.283s
:(){ : | :& }; time :
реальный 0m00.002 с
Все еще работает
Ваши примеры:
:(){ (:) | (:) }; :
Где второе закрытие
)
отделяет,}
является более сложной версией:(){ :|:;};:
. В любом случае каждая команда в канале вызывается внутри вложенной оболочки. Который является эффектом()
.:(){ : | :& }; :
Это более быстрая версия, написанная без пробелов:
:(){(:)|:&};:
(13 символов).:(){ : | : }; :
### работает в zsh, но не в bash.Имеет синтаксическую ошибку (в bash), метасимвол необходим перед закрытием
}
,как это:
[a] Создайте нового чистого пользователя (я назову моего
bize
). Войдите в систему этого нового пользователя либо в консолиsudo -i -u bize
, либо:Проверьте, а затем измените
max user processes
лимит:Использование только 10 работ , как это только один одинокий новый пользователь:
bize
. Это облегчает вызовkillall -u bize
и избавление системы от большинства (не всех) бомб. Пожалуйста, не спрашивайте, какие еще работают, я не скажу. Но все же: довольно низкий, но на безопасной стороне, адаптироваться к вашей системе .Это гарантирует, что «вилочная бомба» не разрушит вашу систему .
Дальнейшее чтение:
источник