eu deletei / bin / rm. Como faço para recuperá-lo?

166

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

sudo rm -f /bin/rm

Achei que poderia reinstalar o coreutils : estava errado!

apt-get install --reinstall coreutils apresenta um erro de dpkg , dizendo que não foi possível remover o pacote. Compilar a partir da fonte não funciona porque o Makefile usa rm .

Como posso obter um rm de funcionamento?

    
por user60684 18.02.2014 / 17:14

5 respostas

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

E nunca mais.

Why didn't you use sudo with apt-get?

Porque o comando download não exige:

download
download will download the given binary package into the current directory.

Portanto, a menos que você esteja em algum diretório que não possa escrever, não será necessário usar sudo , e isso poderá se tornar problemático mais tarde, pois você precisará de root para remover / mover o pacote.

    
por 18.02.2014 / 17:21
106

debian e suas derivadas (e provavelmente a maioria das outras distribuições) vêm com busybox que é usado no initramfs .

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

Você pode temporariamente ligar simbolicamente /bin/rm a /bin/busybox :

ln -s busybox /bin/rm

Para obter um rm em funcionamento (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 que busybox inclui. Essa lista varia de uma implantação para outra. Você pode obter a lista com busybox --list .

Observe, entretanto, que elas são versões limitadas dos utilitários correspondentes. Eles às vezes suportam extensões GNU, mas geralmente não, e alguns deles nem mesmo suportam todos os recursos padrão / POSIX (alguns recursos podem ser habilitados / desabilitados em tempo de compilação).

Como alternativa, você pode usar o% r dozsh:

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

O módulo zsh/files fornece alguns comandos internos adicionais ( rm , mv , ln , mkdir , rmdir , chown , chmod , sync ). É útil nesse tipo de situação ou quando você não pode desembolsar mais processos, mas tem um zsh em execução interativa.

ksh93 também tem um número de comandos extra / opcional buitin, mas não rm entre 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 script ksh93 .

    
por 18.02.2014 / 17:56
29

No caso de apt-get ou dpkg precisar de rm e sem rm , uma reinstalação não é possível, então você pode emular rm com perl :

cat > /bin/rm << "EOF"
#!/usr/bin/perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm
    
por 18.02.2014 / 17:45
14

Eu tentaria obter o binário rm correto de outra máquina e, em seguida, usando scp ou algo para copiá-lo para o Pi. Isso, obviamente, só funciona se scp já estiver instalado ...

Se scp não estiver disponível, nc (a.k.a. netcat) no lado de envio e bash com um redirecionamento /dev/tcp/HOST/PORT no lado de recebimento também funcionarão.

Se você não tiver outra máquina Raspbian, poderá recuperar o pacote coreutils (obtenha o .deb para a versão correta) e descompacte-o 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 tiver outra máquina com o dpkg, você pode extrair o arquivo com ar (das ferramentas de desenvolvimento binutils) e tar:

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm
    
por 18.02.2014 / 17:30
13

Como é 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 fez o download do coreutils.deb antes de tentar instalá-lo, e o dpkg-deb garantiu a existência em um sistema baseado no debian.

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

Se você vai brincar, pode querer instalar o pacote busybox-static, que funciona mesmo se você quebrar todo o resto.

    
por 20.02.2014 / 06:29