web-dev-qa-db-ja.com

/ bin / rmを削除しました。どうすれば回復できますか?

ただ面白くするために、Raspbianを実行しているRaspberry Piでこのコマンドを使用すると思いました。

Sudo rm -f /bin/rm

coreutilsを再インストールするだけでいいと思った:間違っていた!

apt-get install --reinstall coreutilsは、パッケージを削除できなかったというdpkgからのエラーを表示します。 Makefilermを使用するため、ソースからのコンパイルは機能しません。

正常に動作するrmを戻すにはどうすればよいですか?

168
user60684
Sudo touch /bin/rm && Sudo chmod +x /bin/rm
apt-get download coreutils
Sudo dpkg --unpack coreutils*

そして二度と。


Apt-getでSudoを使用しなかったのはなぜですか?

downloadコマンドはそれを必要としないので:

download
downloadは、指定されたバイナリパッケージを現在のディレクトリにダウンロードします。

したがって、書き込みできないディレクトリにいない限り、Sudoを使用する必要はありません。削除/移動するにはroot権限が必要になるため、後で問題が発生する可能性がありますその包み。

194
Braiam

debianとその派生物(そしておそらく他のほとんどのディストリビューション)には、busyboxで使用されるinitramfsが付属しています。

busyboxは、ほとんどのコアコマンドラインユーティリティを単一の実行可能ファイルにバンドルします。

一時的に/bin/rm/bin/busyboxにシンボリックリンクできます。

ln -s busybox /bin/rm

動作するrmを取得するには(その後、apt-get install --reinstall coreutilsを実行できます)。

同じ方法が、busyboxに含まれる他のすべてのユーティリティに使用できます。そのリストは、デプロイメントごとに異なります。リストはbusybox --listで取得できます。

ただし、これらは対応するユーティリティの限定バージョンであることに注意してください。 GNU=拡張機能をサポートすることもありますが、一般的にはサポートしておらず、一部の機能はすべての標準/ POSIX機能をサポートしていません(コンパイル時に有効/無効にできる機能もあります)。

または、zshの組み込みrmを使用することもできます。

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

zsh/filesモジュールには、いくつかの追加の組み込みコマンド(rmmvlnmkdirrmdirchownchmodsync)。このような状況や、これ以上プロセスをforkできないが、インタラクティブなzshを実行している場合に役立ちます。

ksh93にもいくつかの追加/オプションコマンドbuitinがありますが、それらの中にはrmがありません(basenamechmoddirnamegetconfheadmkdirlognamecatcmpcutunamewcsync)。あなたはそれらを呼び出すことができます:

command /opt/ast/bin/the-command

ksh93スクリプト内。

106

万一に備えて apt-getまたはdpkgにはrmが必要であり、rmがないと再インストールは不可能であり、rmPerlでエミュレートできます。

cat > /bin/rm << "EOF"
#!/usr/bin/Perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm
28
user55518

別のマシンから正しいrmバイナリを取得してから、scpまたは何かを使用してそれをPiにコピーしてみます。もちろん、これはscpがすでにインストールされている場合にのみ機能します...

scpが使用できない場合は、送信側のnc(別名netcat)と受信側の/dev/tcp/Host/PORTリダイレクトを使用したbashも機能する可能性があります。

別のRaspbianマシンがない場合は、 coreutilsパッケージ (適切なバージョンの.debを取得)を取得し、dpkg-deb(Debian/Ubuntu/Mint /…、たとえそれがPi上になくても):

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

Dpkgを使用する別のマシンがない場合は、ar(binutils開発ツールから)とtarを使用してファイルを抽出できます。

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm
14

これはdebian(またはubuntu)なので、ファイルを取得する簡単な方法があります。

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

これは、apt-getがインストールを試みる前にcoreutils.debをダウンロードし、dpkg-debがdebianベースのシステムに存在することが保証されているため機能します。

/ tmpに直接抽出しないでください。親ディレクトリの権限が変更されます。

いろいろ試してみる場合は、busybox-staticパッケージをインストールすることをお勧めします。これは、他のすべてを壊しても機能します。

13
Dan Merillat