Я читал предупреждение Форума Ubuntu о злонамеренных командах и нашел этот интересный драгоценный камень:
:(){ :|:& };:
ПРЕДУПРЕЖДЕНИЕ: вышеупомянутый код разрушит Вашу машину, если Вы не будете иметь в распоряжении строгие пределы proc (который Вы, вероятно, не делаете), запрос "жесткого" перезапуска.
Считайте этот код подобным выполнению
sudo rm -rf /
.
Но что это означает? Даже с моим опытом программирования я никогда не видел команду, что загадочный это не ассемблер.
Это, как Вы сказали, fork-бомба. То, что это делает, определяют функцию, затем называют его. Функция вызвана :
.
Давайте назовем его forkbomb
таким образом, мы можем лучше видеть то, что продолжается:
forkbomb(){ forkbomb|forkbomb& };forkbomb
Как Вы видите и вероятно предполагаете на основе своего опыта программирования, первая часть является функциональным определением (forkbomb(){ ... }
), и самое последнее :
то, где функция вызвана ( ;
просто разделяет операторы в Bash).
Теперь, что делает эта функция? Если Вы будете знакомы с Bash, то Вы будете знать что |
символ передает стандартный вывод по каналу одной команды/программы к стандартному входу другого. Так в основном, :|:
запускает два экземпляра функции (это - то, где она "разветвляется").
И затем волшебство: &
помещает те команды в фоновом режиме, позволяя исходной функции возвратиться, в то время как каждый экземпляр разветвляется, пока коровы не приходят домой в фоновом режиме, таким образом израсходовав все Ваши ресурсы и удаляя систему (если это не имеет ограничения, наложенные на него).
Взятый от Fork-бомбы статьи Wikipedia:
:() # define ':' -- whenever we say ':', do this:
{ # beginning of what to do when we say ':'
: # load another copy of the ':' function into memory...
| # ...and pipe its output to...
: # ...another copy of ':' function, which has to be loaded into memory
# (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
& # disown the functions -- if the first ':' is killed,
# all of the functions that it has started should NOT be auto-killed
} # end of what to do when we say ':'
; # Having defined ':', we should now...
: # ...call ':', initiating a chain-reaction: each ':' will start two more.
Сломанный:
: () // Define ':' as a function. When you type ':' do the following
{
: // Call ':'
| // Redirect output
: // Into ':'
& // Push process to the background
}; // End of ':' def
: // Now do ':'
Изменение :
кому: bomb
и Вы имеете:
bomb(){ bomb|bomb& };bomb
Это действительно довольно изящно.