Чому команда “: () {: |: &} ;:” зробила мою систему так сильно відсталою, що мені довелося перезавантажити?


286

НЕБЕЗПЕЧНО!

Не запускайте цю команду, щоб "перевірити" її, якщо ви не готові до збоїв та / або примусового перезавантаження системи.

Я був у своєму віртуальному вікні 12.04, намагаючись скласти додаток, і під час очікування я випадково потрапив на форум, де коментар сказав:

Спробуйте :(){ :|: & };:
Fun теж не потребує кореня.

Не замислюючись, я запустив це у своєму гном-терміналі. Це зробило мій 12.04 (у Virtualbox) відставання настільки сильно, що мені довелося його закрити.

Моє запитання - що робить ця команда?

: () {: |: &} ;:



1
Також дивіться стару тему: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau



9
"відставати так погано" досить оптимістично.
pstadler

Відповіді:


372

Це називається вилковою бомбою .

:() означає, що ви визначаєте функцію, яка називається :

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

Це ;розділювач команд.

: запускає функцію вперше.

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

Запуск у Virtualbox був досить розумним, інакше вам довелося б перезапустити ПК.


27
Ця відповідь, схоже, говорить про те, що перезавантаження - це єдиний спосіб звернення. Але насправді цю вилкову бомбу можна вбити без перезавантаження, і я фактично зауважив, що вона в деяких випадках не працює належним чином у деяких системах (тому що межа їх нересту встановлена ​​чітко).
Конрад Рудольф

27
Насправді, для повного пояснення слід, мабуть, згадати, що ;це роздільник команд. { ... }Частина просто зміст функції.
CVn

@ MichaelKjörling +1 Я навіть не зрозумів синтаксис, поки не взяв до уваги ваші коментарі.
jumpnett

1
@SuperMatt Я не знаю, чи це питання все ще активне, але все одно я хотів знати, що робить |і що &робити. Я розумію, ви надали функцію, але я хотів знати, що вони роблять
Noober

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", і процес (и) припиняється, якщо користувач виходить із системи (якщо для виходу з системи ще доступні ресурси) .... якщо тільки і до тих пір, поки не буде запущено "відхилення" від процесу або не виконане завдання. Після цього він справді відмовляється: вихід із системи не припиняється, а fg не впливає.
Рондо

1
Хоча це лише другорядний момент, дужки не означають, що в оболонкових оболонках немає параметрів, вони є лише окрасою, що залишилася від мов стилю С.
Чарлі Хардінг

75

Ця команда є добре відомою версією вилкової бомби

вилка бомби pic з wikipedia

Це призводить до втрати пам’яті на комп’ютері, нескінченно припиняючи процес. Існує кілька гарантій, які ви також можете використовувати проти цього:

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


18

За цим :(){ :|: & };: називається

Forkbomb - різновид поетичного творця вірусів

... Хитра маленька програма командує їй робити кілька копій себе, встановлюючи ланцюгову реакцію і тим самим швидко вичерпуючи ресурси системи ...

Тому радимо не запускати це, це може призвести до пошкодження обладнання, оскільки це призведе до виконання петльового виконання, може легко призвести до нагрівання ноутбуків.

Ще одне посилання пояснює сюди знімки екрана .


59
Якщо вилка бомби завдає технічної шкоди , то у вас є набагато більша і глибша проблема.
CVn

38
Можливо, він говорив про бомбу з форкою виделки, яка може вибухнути біля вашого ПК?
dysoco

2
Посилання на скріншот порушено.
IMustBeSomeone

0

Це називається " fork-bomb ", як було пояснено вище, і іншим способом цього було б використання фонового виконання, а не трубопроводу:

:(){ :&:;};:
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.