Dlaczego polecenie „: () {: |: &} ;:” spowodowało, że mój system opóźnił się tak bardzo, że musiałem zrestartować komputer?

286

NIEBEZPIECZEŃSTWO!

Nie uruchamiaj tego polecenia, aby go „przetestować”, chyba że jesteś przygotowany na awarię i / lub wymuszone ponowne uruchomienie systemu.

Byłem w mojej Virtualbox z 12.04 próbując skompilować aplikację i czekając, przypadkiem trafiłem na forum, na którym napisano komentarz:

Spróbuj też :(){ :|: & };:
Zabawy i nie wymaga rootowania.

Bez zastanowienia uruchomiłem go w terminalu gnomów. Tak bardzo opóźniało moje 12.04 (w Virtualbox), że musiałem je wyłączyć.

Moje pytanie brzmi: co robi to polecenie?

: () {: |: &} ;:

blade19899
źródło
36
powiązane Jak chronić Ubuntu przed bombą widełkową
Sathyajith Bhat
1
Zobacz także stary wątek: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau
możliwy duplikat witryny: stackoverflow.com/questions/515844/…
Ciro Santilli 21 改造 中心 法轮功 六四 事件
9
„tak opóźnione” jest dość optymistyczne.
pstadler

Odpowiedzi:

372

Nazywa się to bombą widełkową .

:() oznacza, że ​​definiujesz funkcję o nazwie :

{:|: &}oznacza uruchomienie funkcji :i :ponowne wysłanie danych wyjściowych do funkcji i uruchomienie jej w tle.

Jest ;to separator poleceń.

: uruchamia funkcję po raz pierwszy.

Zasadniczo tworzysz funkcję, która wywołuje się dwa razy przy każdym wywołaniu i nie ma możliwości zakończenia się. Będzie się podwajać, aż zabraknie zasobów systemowych.

Uruchomienie w Virtualbox było całkiem rozsądne, w przeciwnym razie musiałbyś ponownie uruchomić komputer.

SuperMatt
źródło
27
Ta odpowiedź wydaje się sugerować, że ponowne uruchomienie jest jedynym rozwiązaniem . Ale w rzeczywistości tę widelecową bombę można zabić bez ponownego uruchamiania, a ja faktycznie zauważyłem, że i tak nie działa poprawnie w niektórych systemach (ponieważ ich limit odradzania jest rozsądnie ustawiony).
Konrad Rudolph
27
Właściwie dla pełnego wyjaśnienia należy prawdopodobnie wspomnieć, że ;jest to separator poleceń. { ... }Część jest po prostu treść funkcji.
CVn
@ MichaelKjörling +1 Nie zrozumiałem nawet składni, dopóki nie wziąłem pod uwagę twoich komentarzy.
jumpnett
1
@ SuperMatt Nie wiem, czy to pytanie jest nadal aktywne, ale i tak chciałem wiedzieć, co robi |i co robi &. Rozumiem, że zapewniłeś działanie tej funkcji, ale chciałem wiedzieć, co robią ci dwaj
Noober
1
@Noober, jeśli nadal się zastanawiasz (tak jak ja w tej czarnej dziurze zwięzłej i tajemniczej dokumentacji, którą jest linux), wiem! | jest potokiem umieszczanym po poleceniu, aby wysłać dane wyjściowe tych poleceń jako dane wejściowe do następującego polecenia. & jest rozwidleniem, tworzy nowy wątek dla poprzedniego polecenia, pozostawiając bieżący wątek, aby kontynuować wykonywanie kolejnych poleceń
flurbius
179

Jest to tak zwana bomba widełkowa zaimplementowana w powłoce.

z wikipedii:

:(){ :|:& };:
\_/| |||| ||\- ... 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:
Michał Šrajer
źródło
3
Chociaż jest to punkt styczny, a termin „odrzucony” może być przeciążony, technicznie proces umieszczony w tle nie jest odrzucany i zawsze można go przenieść na pierwszy plan za pomocą polecenia „fg”, a proces (y) zostaną zakończone, jeśli użytkownik wylogowuje się (jeśli nadal są dostępne zasoby do wylogowania) ... chyba że i dopóki nie uruchomi się 'disown' w procesie lub jobid. Po tym jest rzeczywiście odrzucany: wylogowanie się nie zakończy i fg nie będzie miało żadnego efektu.
Rondo
1
Chociaż jest to tylko drobna uwaga, nawiasy nie oznaczają, że w powłokach przypominających bash nie ma żadnych parametrów, są jedynie dekoracją pozostałą po językach w stylu C.
Charlie Harding,
75

To polecenie jest dobrze znaną wersją bomby widelcowej

widelec pic bomb z wikipedii

Powoduje to, że komputerowi kończy się pamięć, nieskończenie przerywając proces. Istnieją również zabezpieczenia, których można przed nim użyć:

Systemy typu Unix zwykle mają limit procesu, kontrolowany przez polecenie powłoki ulimit lub jego następcę, setrlimit. Jądra systemu Linux ustawiają i egzekwują limit RLIMIT_NPROC („limit zasobów”) procesu. Jeśli proces próbuje wykonać rozwidlenie, a użytkownik, który jest właścicielem tego procesu, jest już właścicielem RLIMIT_NPROCprocesów, rozwidlenie kończy się niepowodzeniem. Dodatkowo w systemie Linux lub * BSD można edytować pam_limitsplik konfiguracyjny /etc/security/limits.confz tym samym skutkiem. Jednak nie we wszystkich dystrybucjach Linuksa pam_limitsmoduł jest instalowany domyślnie.

Nemo
źródło
18

Zgodnie z tym :(){ :|: & };: nazywa się

Forkbomb jest rodzajem twórcy wirusów poetyckich

... Przebiegły mały program nakazuje mu wykonanie wielu kopii samego siebie, wywołując reakcję łańcuchową, a tym samym szybko wyczerpując zasoby systemu ...

Dlatego zaleca się, aby nie uruchamiać tego, może to spowodować uszkodzenie sprzętu, ponieważ powoduje wykonanie pętli, może łatwo powodować nagrzewanie się laptopów.

Inny link wyjaśnia tutaj zrzuty ekranu .

atenz
źródło
59
Jeśli bomba widełkowa powoduje uszkodzenie sprzętu , masz o wiele większy i głębszy problem.
CVn
38
Może mówił o bombie o kształcie widelca, która może eksplodować w pobliżu twojego komputera?
dysoco
2
Link do zrzutu ekranu jest uszkodzony.
IMustBeSomeone
0

Nazywa się to „ bombą widełkową ”, jak wyjaśniono powyżej, a innym sposobem na to byłoby użycie wykonywania w tle, a nie potokowanie:

:(){ :&:;};:
Karlsebal
źródło