: (){ :|:& };: Como vencer o comando da morte?
Luciano Andress Martini | 5 de maio de 2010Este simples comando é capaz de derrubar um servidor ou estação linux em poucos segundos: não importa com qual usuário você se logue num ssh ou terminal:
: (){ : | : & };:
Há muito tempo me deparei com este problema nos meus servidores que rodavam ssh e após conseguir soluciona-lo de diversos modos diferentes decidi descreve-los aqui: (não esqueça de fazer estes comandos com o usuário administrador, recomendo que use o comando sudo su ou simplesmente su(dependendo a distribuição) antes de executar os comandos)
1- O primeiro modo e mais simples é digitando
echo 'alias :="echo 1"' >>/etc/profile
Com isso o comando da morte já não irá mais funcionar, entretanto esta não é a solução ideal, apesar de ser o mais simples no caso de você não ter o pam. (Existem formas de encontrar brechas nessa solução, como o usuário criar uma nova alias, então só os outros modos são 100% garantidos)
2- O segundo modo é limitando um grupo de usuários quanto o número de processos (no caso mostro como limitar o grupo estudantes):
echo '@estudantes hard nproc 600' >>/etc/security/limits.conf
(Ou Edite o arquivo /etc/security/limits.conf)
-Não se esqueça de criar um grupo estudantes, em /etc/group e de colocar na frente dele o nome dos usuários em que se aplicara a permissão.
3- O terceiro modo é limitando todos os usuários quanto ao número de processos:
echo '* hard nproc 1000' >>/etc/security/limits.conf
Pronto! Nunca mais os usuários do SSH vão poder fazer essa brincadeira ! =[ Que pena.







Grande Mestre Luciano,
O colega poderia descrever o funcinamento desse comando malígno?
É que tou começando a estudar mais shell script e gostaria de saber esse aí.
Aproveitando a deixa, rsrsrs, o colega teria alguma apotila free para indicar?
De já agradeço imensamente.
Abraços,
TEMS
Realmente é muito interessante, testei aqui e travou tudo….
Estuo shell e em alguns livros que tenho conta de muias artimanhas, mas esta daí não me lembro de ter visto em mais de 15 anos de terminal…
o q esse comando faz?
Funciona assim, primeiro é declarada a função : (dois pontos)
As funções são declaradas da seguinte forma:
nome_da_função(){ comandos };
No caso o nome da função é : (dois pontos)
Os comandos são:
: | :&
ou seja, chama a própria função executando-a simultaneamente com ela própria via | (pipe), o & (e comercial) faz com que estes comandos sejam executados em segundo plano.
O : (dois pontos) no final do comando da morte chama a função depois de declará-la.
Resumindo este comando gera uma função que chama ela própria duas vezes, infinitas vezes, gerando um loop.
Espero que dê para entender o conceito.
Valeu Fabricio é bem simples mesmo o funcionamento e eu estava achando estranho pois : é um comando que produz código de sucesso em Shell Script, isto é digitar : e pressionar enter, gera o código de sucesso $? = 0.
Mas aí foi aplicado de uma forma bem diferente para confundir a mente…
Sendo assim pode-se declarar uma função com um nome diferente.
É isso aí caro Fabrício, não custa nada poder compartilhar conhecimentos com os simples newbies.
Valeu mesmo pela explicação, só assim nosso grande Luciano se manifestou também.
Luciano, vc ainda me deve o complemento da resposta de minha observação acima, esqueceu não, nẽ!?
Abraços,
TEMS
Isso é que dá ficar anos usando shell para os trabalhos habituais e esquecer que é preciso realmente conhecê-lo. Isto, se for possível, conhecer de todo. Melhor assim, pois haverá sempre um crescimento de possibilidades. Obrigado as perguntas feitas e a explicação do fabricio.