Uma aventura em bash

Em uma lista de discussão da qual eu participo, cujo nome não deve ser mencionado nunca, as pessoas começaram a discutir bobagens feitas em servidores Unix, e eu pude contar uma história que aconteceu comigo em 1998. Se você é um administrador Unix ou, em especial Linux, você provavelmente vai achar interessante. Caso contrário, você vai achar ainda mais chato que os posts habituais.

Eu estava conectado em um servidor Linux remoto, resolvendo um problema grave e urgente nos servidores SMTP de um cliente, um grande grupo editorial e de mídia cujo nome todos conhecem. Isso era resultado de um trabalho de consultoria.

Eu editei um script para mover alguns arquivos de diretório, e esse script moveu o diretório /bin para algum lugar desconhecido.

O que aconteceu foi mais ou menos o seguinte:

# [cria]
# [roda]
... script demora demais
^C
# ls
ls: command not found
# cd /bin
/bin: no such file or directory
# mkdir /bin
mkdir: command not found

… desespero, diversas tentativas de recuperar o diretório /bin, medo, etc…

Daí eu me toquei: eu estou em uma máquina Linux, com exatamente a mesma distribuição e versão. A máquina remota aceita login como root. Tudo que eu preciso fazer é copiar o meu diretório /bin para a máquina remota usando o scp. Então eu tento:

local$ scp -pr /bin root@remote:/bin
Password:
/bin/bash: command not found

Lógico, duh! Então eu fiquei esperto:

# which perl
/usr/bin/perl
# perl -e 'mkdir "/bin"'
#

Isso! Agora eu só precisava novamente do bash, que eu sabia que ainda existia na máquina, porque, afinal de contas, eu estava com uma instância aberta. Então eu fiz o seguinte:

# perl > /bin/cat

while(<>) {
print
}
^D
#!/usr/bin/perl
while(<>) {
print
}
^D
# perl -e 'chmod "/bin/cat", 0777'
# cat /proc/self/exe > /bin/bash
# perl -e 'chmod "/bin/bash", 0777'

E então eu tinha um bash funcionando! Então eu rodei o scp novamente e funcionou direitinho. Claro que cada passo me tomou bastante tempo, porque eu tive de testar cada comando e cada tecla, porque se eu perdesse esse shell, eu não teria nenhuma saída. Eu não falei das outras tentativas, como enviar via ftp, rsync, encontrar o diretório para onde eu tinha movido o /bin, rodar vi, find, etc, etc, etc. No total, devem ter sido uns 30 minutos, ou talvez mais, ou menos, não sei. O tempo estava andando de forma estranha naquela tarde. Nas festas certas é uma história popular. A sensação no final foi esta.

3 thoughts on “Uma aventura em bash”

  1. Você não verificou o conteudo da variavel $PATH?
    Já aconteceu uma vez comigo algo semelhante e no meu caso, por não ser muito experinte, me causou desespero.
    muitos resets depois whichs
    com command no found
    veio uma isnpiração:
    echo $PATH
    O diretório /bin e nem o /usr/bin estavam no PATH
    Nada que um export nâo resolvesse.

  2. Primeiro, valeu pelos comentários.

    Bem, eu não acho que tenha verificado, porque eu nem precisava. Meu PATH estava correto antes de eu rodar o script mal-feito, e não teria como ter sido alterado. Além disso, consegui descobrir que o diretório /bin não existia mais por diversas formas (uma delas foi usar o completion para ver os diretórios).

    Ou seja, a minha besteira não foi pequena não. Foi uma de proporções épicas.

Leave a Reply

Your email address will not be published. Required fields are marked *