Questão Por que o comando “: () {: |: &} ;:” atrasou tanto o meu sistema que tive que reinicializar?


PERIGO!

Não execute este comando para "testá-lo", a menos que você esteja preparado para uma falha e / ou reinicialize seu sistema.

Eu estava no meu Virtualbox executando o 12.04 tentando compilar um aplicativo e, enquanto esperava, aconteço com um fórum em que um comentário dizia:

Experimentar :(){ :|: & };:
  Divertido também, e não precisa de raiz.

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

Minha pergunta é o que esse comando faz?

:(){ :|: & };:

273
2017-07-04 11:29


origem


relacionado Como proteger o Ubuntu da bomba garfo - Sathya
Veja também um tópico antigo: ubuntuforums.org/showthread.php?t=1392511 - Paddy Landau
Relacionado: Como funciona uma bomba de garfo? e Onde está o garfo () na bomba do garfo: () {: |: &}; - terdon♦
possível duplicado entre sites de: stackoverflow.com/questions/515844/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
"lag tão mal" é bastante otimista. - pstadler


Respostas:


Isso é chamado de bomba de garfo.

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

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

o ; é um separador de comando, como &&.

: executa a função pela primeira vez.

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

Correndo no Virtualbox foi muito sensato realmente caso contrário você teria que reiniciar seu pc.


346
2017-07-04 11:34



Esta resposta parece sugerir que a reinicialização é a só recurso. Mas, na verdade, essa bifurcação pode ser eliminada sem reiniciar, e eu realmente observei que ela não funciona corretamente em alguns sistemas de qualquer maneira (porque o limite de spawn é definido de forma sensata). - Konrad Rudolph
Na verdade, para uma explicação completa, isso provavelmente deve mencionar que ; é um separador de comando. o { ... } parte é simplesmente o conteúdo da função. - Michael Kjörling
@ MichaelKjörling +1 Eu nem entendi a sintaxe até ter levado em consideração seus comentários. - jumpnett
@SuperMatt Eu não sei se esta pergunta ainda está ativa, mas de qualquer maneira eu queria saber o que | e & Faz. Eu entendo que você forneceu o funcionamento da função, mas eu queria saber o que esses dois fazem - Noober
@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 pipe que é colocado após um comando para enviar essa saída de comandos como a entrada para o comando que segue. & é um fork que cria um novo thread para o comando anterior deixando o thread atual para continuar executando mais comandos - flurbius


Este é um chamado bomba de garfo implementado em 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:

162
2017-07-04 11:35



Embora seja um ponto tangencial e o termo 'rejeitado' possa ser sobrecarregado, tecnicamente, um processo colocado em segundo plano não é renegado e sempre pode ser colocado em primeiro plano com o comando 'fg', e o (s) processo (s) terminará (ão) se o usuário efetua logout (se ainda houver recursos disponíveis para realizar um logout) .... a menos que e até que alguém execute 'disown' no processo ou jobid. Depois disso, é de fato renegado: o logout não terminará e fg não terá efeito. - Rondo
Embora seja apenas um ponto de menor importância, os parênteses não significam que não há parâmetros em shells semelhantes a bash, eles são apenas elementos remanescentes de linguagens no estilo C. - Charlie Harding


Esse comando é uma versão bem conhecida do bomba de garfo

fork bomb pic from wikipedia

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

Os sistemas do tipo Unix geralmente possuem um limite de processo, controlado por um comando shell ulimit ou seu sucessor setrlimit. Os kernels do Linux definem e impõem o RLITIT_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_NPROC processos, o fork falha. Adicionalmente, no Linux ou * BSD, pode-se editar o pam_limits arquivo de configuração /etc/security/limits.conf para o mesmo efeito. No entanto, nem todas as distribuições do Linux têm pam_limits módulo instalado por padrão.


71
2017-07-04 11:37





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

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

... O pequeno programa desonesto manda fazer várias cópias de   em si, desencadeando uma reação em cadeia e, assim, esgotando rapidamente   recursos do sistema ...

Portanto, é aconselhável não executar isso, pode causar danos ao hardware, uma vez que causa a execução de loopwise, pode causar aquecimento facilmente em laptops.

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


18
2017-07-04 11:35



Se uma bomba bifurcada causar dano de hardwareentão você tem um problema muito maior e mais profundo. - Michael Kjörling
Talvez ele estivesse falando de uma bomba com formato de garfo que pode explodir perto do seu PC? - dysoco
O link para a captura de tela está quebrado. - IMustBeSomeone