Por que o comando “: () {: |: &} ;:” fez meu sistema ficar tão lento que eu precisei reiniciar?

286

PERIGO!

Não execute este comando para 'testá-lo', a menos que você esteja preparado para uma falha e / ou forçar a reinicialização do sistema.

Eu estava no meu Virtualbox executando o 12.04 tentando compilar um aplicativo e, enquanto esperava, tive a chance de encontrar um fórum em que um comentário dizia:

Experimente o :(){ :|: & };:
Fun também e não precisa de raiz.

Sem pensar, corri no meu terminal gnomo. Isso fez meu 12.04 (no Virtualbox) ficar tão ruim que tive que desligá-lo.

Minha pergunta é o que esse comando faz?

: () {: |: &} ;:

blade19899
fonte
36
relacionados Como proteger o Ubuntu a partir bomba fork
Sathyajith Bhat
1
Veja também um tópico antigo: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau
possível cross site duplicata de: stackoverflow.com/questions/515844/...
Ciro Santilli新疆改造中心法轮功六四事件
9
"lag tão mal" é bastante otimista.
Pstadler

Respostas:

372

Isso é chamado de fork fork .

:() significa que você está definindo uma função chamada :

{:|: &}significa executar a função :e enviar sua saída para a :função novamente e executá-la em segundo plano.

O ;é um separador de comandos.

: executa a função pela primeira vez.

Essencialmente, você está criando uma função que se chama duas vezes a cada chamada e não tem como se finalizar. Ele continuará dobrando até você ficar sem recursos do sistema.

Correr no Virtualbox era bastante sensato, caso contrário você teria que reiniciar o seu PC.

SuperMatt
fonte
27
Essa resposta parece sugerir que a reinicialização é o único recurso. Mas, na verdade, essa bomba de garfo pode ser morta sem reiniciar, e eu realmente observei que ela não funciona corretamente em alguns sistemas (porque o limite de reprodução deles é sensato).
Konrad Rudolph
27
Na verdade, para uma explicação completa, isso provavelmente deve mencionar que ;é um separador de comandos. A { ... }parte é simplesmente o conteúdo da função.
um CVn
@ MichaelKjörling +1 Eu nem entendi a sintaxe até levar em consideração seus comentários.
jumpnett
1
@SuperMatt Eu não sei se essa pergunta ainda está ativa, mas mesmo assim eu queria saber o que faz |e o que &faz. Eu entendo que você forneceu o funcionamento da função, mas eu queria fazer saber o que estes dois fazem
Noober
1
@ Noober se você ainda está se perguntando (como eu estou neste buraco negro de documentação concisa e enigmática que é linux) eu sei! | é um canal, é colocado após um comando para enviar esses comandos como saída para o comando a seguir. E é um fork cria um novo segmento para o comando anterior deixando o segmento atual para continuar a executar mais comandos
flurbius
179

Esta é uma bomba de garfo chamada implementada no shell.

da wikipedia:

:(){ :|:& };:
\_/| |||| ||\- ... 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
fonte
3
Embora seja um ponto tangencial e o termo 'renegado' possa estar sobrecarregado, tecnicamente, um processo colocado em segundo plano não é renegado e sempre pode ser trazido para o primeiro plano com o comando 'fg', e o (s) processo (s) serão encerrados se o usuário efetua logout (se ainda houver recursos disponíveis para realizar um logout) .... a menos e até que um seja executado 'deserdado' no processo ou no jobid. Depois disso, é de fato negado: o logout não será encerrado e fg não terá efeito.
Rondo
1
Embora seja apenas um ponto menor, os parênteses não significam que não haja parâmetros nos invólucros do tipo bash, eles são apenas uma decoração que resta das linguagens no estilo C.
Charlie Harding
75

Esse comando é uma versão bem conhecida da bomba de forquilha

foto de bomba de garfo da wikipedia

Isso faz com que o computador fique sem memória, bifurcando um processo infinitamente. Existem algumas salvaguardas que você também pode usar:

Os sistemas do tipo Unix geralmente têm um limite de processo, controlado por um comando ulimit shell ou seu sucessor, setrlimit. Os kernels do Linux definem e impõem o RLIMIT_NPROC rlimit ("limite de recurso") de um processo. Se um processo tentar executar uma bifurcação e o usuário que possui esse processo já possuir RLIMIT_NPROCprocessos, a bifurcação falhará. Além disso, no Linux ou * BSD, é possível editar o pam_limitsarquivo de configuração /etc/security/limits.confpara o mesmo efeito. No entanto, nem todas as distribuições do Linux têm o pam_limitsmódulo instalado por padrão.

Nemo
fonte
18

De acordo com isso :(){ :|: & };: é chamado

Forkbomb é um tipo de criador de vírus poético

... O programa desonesto ordena que ele faça várias cópias de si mesmo, desencadeando uma reação em cadeia e esgotando rapidamente os recursos do sistema ...

Aconselhado a não executar isso, pode causar danos ao hardware, pois causa a execução em loop, pode causar aquecimento facilmente em laptops.

Outro link explica através de capturas de tela aqui .

atenz
fonte
59
Se uma bomba de garfo causar danos ao hardware , você terá um problema muito maior e mais profundo.
um CVn
38
Talvez ele estivesse falando de uma bomba com formato de garfo que pode explodir perto do seu PC?
Disoco
2
O link para a captura de tela está quebrado.
IMustBeSomeone
0

Ele é chamado de " fork-bomb ", como explicado acima, e outra maneira de fazer isso seria usar a execução em segundo plano em vez da tubulação:

:(){ :&:;};:
karlsebal
fonte