Ta bomba rozwidlona zawsze przypomina mi coś, co powiedział nauczyciel programowania AI na jednej z pierwszych lekcji, w których uczestniczyłem: „Aby zrozumieć rekurencję, najpierw musisz zrozumieć rekurencję”.
U podstaw tej bomby jest funkcja rekurencyjna . Zasadniczo tworzysz funkcję, która wywołuje siebie, która wywołuje siebie, która wywołuje siebie .... aż do wyczerpania zasobów systemowych. W tym konkretnym przypadku rekurencja jest wzmacniana przez użycie potokowania funkcji do siebie ORAZ jej tła.
Widziałem tę odpowiedź na StackOverflow i myślę, że podany tam przykład najlepiej to ilustruje, tylko dlatego, że łatwiej jest zobaczyć, co robi na pierwszy rzut oka (skradziony z linku powyżej ...)
☃(){ ☃|☃& };☃
Zdefiniuj funkcję błędu ☃() { ... }, której ciało wywołuje się (funkcja błędu), przesyłając dane wyjściowe do siebie (funkcja błędu) ☃|☃, i określ wynik w tle &. Następnie, po funkcja jest zdefiniowana, rzeczywiście wywołać funkcję błędu, ; ☃.
Zauważam, że przynajmniej na mojej Arch VM, potrzeba podłożenia procesu do tła nie jest wymagana do uzyskania tego samego rezultatu końcowego, do zużycia całej dostępnej przestrzeni procesu i renderowania hosta. Właściwie teraz powiedziałem, że wydaje się, że czasami kończy proces ucieczki i po jego przeskanowaniu -bash: fork: Resource temporarily unavailablezakończy się na Terminated(i journalctlpokazuje zrzut rdzenia bash).
Aby odpowiedzieć na twoje pytanie dotyczące csh / tcsh, żadna z tych powłok nie obsługuje funkcji, możesz tylko alias. W przypadku tych powłok należy napisać skrypt powłoki, który wywołuje się rekurencyjnie.
Wygląda na to, że zsh cierpi z powodu tego samego losu (z tym samym kodem), nie zrzuca zrzutu pamięci i powoduje, że Arch daje Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., ale nadal się rozwija. Po chwili stwierdza Killed process 162 (systemd-logind) ...(i nadal ma rozwidlenie zsh).
Arch nie wydaje się mieć pacmanwersji ksh, więc zamiast tego musiałem wypróbować ją na Debianie. ksh sprzeciwia się :jako nazwa funkcji, ale używając czegoś - powiedzmy, że b()wydaje się mieć pożądany wynik.