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.