Eu apaguei / bin / rm. Como faço para recuperá-lo?

168

Apenas por diversão, pensei em usar este comando no meu Raspberry Pi executando o Raspbian:

sudo rm -f /bin/rm

Eu pensei que poderia apenas reinstalar coreutils: eu estava errado!

apt-get install --reinstall coreutilsdá um erro de dpkg, dizendo que não foi possível remover o pacote. Compilar a partir da fonte não funciona porque os Makefileusos rm.

Como posso recuperar um trabalho rm?

user60684
fonte
9
Todo .deb é basicamente um arquivo que você pode descompactar e simplesmente copiar o executável rm para / bin.
schaiba
1
Que SO é esse? Linux? Unix? Algo mais? Se Linux, qual distro? 64 bits? 32?
terdon
12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(ou /bin/busybox, ou extraí-lo a partir de um initrd)
Stéphane Chazelas
10
O Raspberry Pi possui seu sistema operacional em um cartão de memória SD, para que você possa extrair o binário rm do pacote em outra máquina e copiá-lo novamente no cartão. Em qualquer caso, conluio hilariante você puxou lá e muito ousada de você admitir isso publicamente :)
Christian
15
@ user645715 37 pessoas acharam esta pergunta divertida.
Brilliand

Respostas:

194
sudo touch /bin/rm && sudo chmod +x /bin/rm
apt-get download coreutils
sudo dpkg --unpack coreutils*

E nunca mais.


Por que você não usou o sudo com o apt-get?

Porque o downloadcomando não exige:

download
download fará o download do pacote binário fornecido no diretório atual.

Portanto, a menos que você esteja em algum diretório que não possa escrever, não precisará usá sudo-lo, e isso poderá ser problemático mais tarde, pois você precisará de rootpermissões para remover / mover o pacote.

Braiam
fonte
3
O apt-get precisa ser executado com o sudo :) #
AWippler
31
@AWippler não, neste caso não.
Braiam
5
Observe que um arquivo executável vazio é executado como um script de shell que não faz nada. Então isso significa invocar /bin/sh. Teria sido mais simples de fazer uma sudo ln -s true /bin/rmou até melhor sudo ln -s busybox /bin/rmter um trabalho rm.
Stéphane Chazelas
1
apt-getprecisa do sudo se você não tiver baixado o coreutils, caso contrário não poderá gravar no local /varonde o debian salva os arquivos baixados.
21714 Kristopher Ives
3
@KristopherIves errado ... apt-geto download do pacote para o diretório atual sempre (sim, mesmo se você usou sudo), a menos que você está em um diretório que você não pode escrever como seu usuário, você não precisa sudo. Por favor, verifique as páginas do manual.
Braiam
106

debiane seus derivados (e provavelmente a maioria das outras distribuições) vêm com os busyboxquais é usado no initramfs.

busybox agrupa a maioria dos utilitários de linha de comando principais em um único executável.

Você pode ligar temporariamente o link simbólico /bin/rmpara /bin/busybox:

ln -s busybox /bin/rm

Para obter um trabalho rm(após o qual você pode fazer o seu apt-get install --reinstall coreutils).

Esse mesmo método pode ser usado para todos os outros utilitários busyboxincluídos. Essa lista varia de uma implantação para outra. Você pode obter a lista com busybox --list.

Observe, no entanto, que são versões limitadas dos utilitários correspondentes. Às vezes, eles suportam extensões GNU, mas geralmente não, e alguns deles nem mesmo suportam todos os recursos padrão / POSIX (alguns recursos podem ser ativados / desativados em tempo de compilação).

Como alternativa, você pode usar zsho builtin rm:

#! /bin/zsh
zmodload zsh/files
rm "$@"

O zsh/filesmódulo fornece com alguns comandos internos adicionais ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync). É útil nesse tipo de situação ou quando você não pode dividir mais processos, mas possui uma zshexecução interativa .

ksh93também tem uma série de extras buitin / opcional comandos, mas não rmentre eles ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync). Você pode invocá-los com:

command /opt/ast/bin/the-command

em um ksh93script.

Stéphane Chazelas
fonte
5
Ótima resposta. Me faz pensar se o OP realmente precisa reinstalar o real rm. ;-) #
1944 joeytwiddle
De fato. Na verdade, isso me faz pensar sobre a exclusão coreutils também ... :-)
Damon
4
@ Damon: coreutils fornece uma versão estendida dos comandos básicos em comparação com o busybox, portanto, embora o busybox seja suficiente para atender aos requisitos do SUSv3, os coreutils são mais úteis; por exemplo, o busybox possui suporte limitado ao i18n.
liori
2
@liori: Eu estava brincando, apesar de 10 a 15 anos atrás, eu provavelmente teria feito isso nessa situação (os "recursos" adicionais, em particular o i18n , não são uma vantagem na minha opinião - traduções inintelegíveis e aprender a usar switches que interrompem inesperadamente scripts em outro computador, não, obrigado). No entanto, hoje em dia, fico feliz se apenas um sistema Linux funcionar sem problemas como instalado sem que eu toque em nada e sem ter que mover / excluir / editar arquivos ou binários do sistema / configuração. Que, infelizmente, ainda não é o caso com bastante frequência, por isso estou certamente não tocar em algo que funciona :-)
Damon
29

No caso apt-getou dpkgnecessidades rme sem rmuma reinstalação não é posssible, então você pode emular rmcom perl:

cat > /bin/rm << "EOF"
#!/usr/bin/perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm
NlightNFotis
fonte
3
Observe que ele não funciona -r, e o fato de não retornar um status de saída correto pode causar problemas.
Stéphane Chazelas
6
@StephaneChazelas é suficiente para permitir apt-get install --reinstall coreutilse fazer com que o OP volte ao normal.
terdon
foi por isso que escrevi "no caso". o pacote coreutils não possui scripts. normalmente, os scripts de pré e pós-instalação falham nos erros, se os arquivos existem ou não, por exemplo, se eles precisam ser removidos. E sim, é verdade que eu estava com preguiça de verificar o pacote com antecedência.
você também pode emular rmcom mv(para 'lixeira')
sendmoreinfo
14

Eu tentaria obter o rmbinário correto de outra máquina e depois usar scpou algo para copiá-lo para o Pi. Obviamente, isso só funciona se scpjá estiver instalado ...

Se scpnão estiver disponível, nc(também conhecido como netcat) no lado de envio e o bash com um /dev/tcp/HOST/PORTredirecionamento no lado de recebimento também poderão funcionar.

Se você não possui outra máquina Raspbian, pode recuperar o pacote coreutils (obter a .debversão correta) e descompactá-lo com dpkg-deb(no Debian / Ubuntu / Mint /…, mesmo que não esteja em um Pi):

dpkg-deb --fsys-tarfile coreutils*.deb | tar xf - ./bin/rm

Se você não possui outra máquina com o dpkg, pode extrair o arquivo com ar(das ferramentas de desenvolvimento binutils) e tar:

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm
MathematicsOrchid
fonte
8
Se scpnão estiver disponível, nc(também conhecido como netcat) no lado de envio e bashcom um /dev/tcp/HOST/PORTredirecionamento no lado de recebimento também poderão funcionar.
MvG
13

Como é o debian (ou ubuntu), existe uma maneira fácil de obter os arquivos:

mkdir /tmp/coreutils
sudo dpkg-deb --extract /var/cache/apt/archives/coreutils_ [tab complete for correct version].deb /tmp/coreutils
sudo cp /tmp/coreutils/bin/rm /bin

Isso funciona porque o apt-get baixou o coreutils.deb antes de tentar instalá-lo e o dpkg-deb garantiu a existência em um sistema baseado em debian.

Não extraia diretamente para / tmp, ele altera as permissões no diretório pai.

Se você quiser brincar, pode instalar o pacote busybox-static, que funciona mesmo que você quebre tudo o resto.

Dan Merillat
fonte