Что означает эта загадочная команда Bash?

Я читал предупреждение Форума Ubuntu о злонамеренных командах и нашел этот интересный драгоценный камень:

:(){ :|:& };:

ПРЕДУПРЕЖДЕНИЕ: вышеупомянутый код разрушит Вашу машину, если Вы не будете иметь в распоряжении строгие пределы proc (который Вы, вероятно, не делаете), запрос "жесткого" перезапуска.

Считайте этот код подобным выполнению sudo rm -rf /.

Но что это означает? Даже с моим опытом программирования я никогда не видел команду, что загадочный это не ассемблер.

23
задан 20.09.2011, 11:21

3 ответа

Это, как Вы сказали, fork-бомба. То, что это делает, определяют функцию, затем называют его. Функция вызвана :.

Давайте назовем его forkbomb таким образом, мы можем лучше видеть то, что продолжается:

forkbomb(){ forkbomb|forkbomb& };forkbomb

Как Вы видите и вероятно предполагаете на основе своего опыта программирования, первая часть является функциональным определением (forkbomb(){ ... }), и самое последнее : то, где функция вызвана ( ; просто разделяет операторы в Bash).

Теперь, что делает эта функция? Если Вы будете знакомы с Bash, то Вы будете знать что | символ передает стандартный вывод по каналу одной команды/программы к стандартному входу другого. Так в основном, :|: запускает два экземпляра функции (это - то, где она "разветвляется").

И затем волшебство: & помещает те команды в фоновом режиме, позволяя исходной функции возвратиться, в то время как каждый экземпляр разветвляется, пока коровы не приходят домой в фоновом режиме, таким образом израсходовав все Ваши ресурсы и удаляя систему (если это не имеет ограничения, наложенные на него).

40
ответ дан 07.12.2019, 09:48

Взятый от 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.
9
ответ дан 07.12.2019, 09:48

Сломанный:

: () // 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

Это действительно довольно изящно.

7
ответ дан 07.12.2019, 09:48

Теги

Похожие вопросы