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


168

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

sudo rm -f /bin/rm

私はちょうど再インストールできると思ったcoreutils:私は間違っていた!

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

どうすればrm元に戻すことができますか?


9
すべての.debは基本的に、解凍してrm実行可能ファイルを/ binにコピーできるアーカイブです。
チャイバ14

1
これは何のOSですか?Linux?Unix?他に何か?Linuxの場合、どのディストリビューションですか?64ビット?32?
テルドン

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(または/bin/busybox、initrdから抽出)
ステファンシャゼラス14

10
Raspberry PiのOSはSDメモリカードにあるため、別のマシンのパッケージからrmバイナリを抽出し、カードにコピーして戻すことができます。いずれにせよ、あなたがそこに引っ張った陽気なスタントとそれを公に認めるようにあなたの非常に大胆な:)
クリスチャン

15
@ user645715 37人がこの質問を面白いと感じました。
ブリリアンド14

回答:


194
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ます。


3
apt-getはsudoで実行する必要があります:)
AWippler 14

31
@AWipplerいいえ、この場合はいいえ。
Braiam

5
空の実行可能ファイルは、何も実行しないシェルスクリプトとして実行されることに注意してください。つまり、呼び出しを意味し/bin/shます。仕事をするsudo ln -s true /bin/rm方が簡単だったでしょうしsudo ln -s busybox /bin/rm、仕事をする方がもっと良かったでしょうrm
ステファンシャゼル14

1
apt-getcoreutilsをダウンロードしていない場合は、sudoが必要です。そうしないと/var、debianがダウンロードしたファイルを保存する場所に書き込むことができません。
クリストファーアイヴス14

3
@KristopherIves wrong ... apt-getパッケージを常に現在のディレクトリにダウンロードするので(使用した場合でもsudo)、ディレクトリ内にいる場合を除き、不要なユーザーとして書き込むことはできませんsudo。マニュアルページを確認してください。
Braiam 14

106

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)。この種の状況や、さらにプロセスをフォークすることはできないが、インタラクティブにzsh実行する場合に役立ちます。

ksh93またではなく、余分な/オプションのコマンドのbuitinの数を持っているrmそれらの間の(basenamechmoddirnamegetconfheadmkdirlognamecatcmpcutunamewcsync)。それらを呼び出すには:

command /opt/ast/bin/the-command

ksh93スクリプトを実行します。


5
素晴らしい答え。OPが本当に本物を再インストールする必要があるのか​​と疑問に思いrmます。;-)
joeytwiddle 14

確かに。実際、これはcoreutilsも削除することを考えさせます... :
デイモン14

4
@Damon:coreutilsはbusyboxと比較して基本的なコマンドの拡張バージョンを提供するため、busyboxはSUSv3の要件を満たすには十分かもしれませんが、coreutilsはより機能的です。たとえば、busyboxではi18nのサポートが制限されています。
リオリ14

2
@liori:私は半分冗談を言っていましたが、10-15年前にはおそらくその状況で実際にやっていただろう(追加された「機能」、特にi18nは私の意見では利点ではありません-不可解な翻訳、別のコンピューターで予期せずスクリプトを壊すスイッチを使用することを学んでください。ただし、最近では、何も触れずに、システム/構成ファイルやバイナリを移動/削除/編集することなく、インストールされたままのLinuxシステムのみがスムーズに実行されれば幸いです。これは悲しいことに、まだ多くの場合、十分なケースではありませんので、私は触れていない確かだ作品何か :-)
デイモン

29

場合、apt-getまたはdpkg必要性rmとせずにrm再インストール後、あなたがエミュレートすることができ、posssibleではないrmperl

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

3
を処理しないことに注意してください-r。正しい終了ステータスを返さないという事実は、問題を引き起こす可能性があります。
ステファンシャゼル14

6
@StephaneChazelasはapt-get install --reinstall coreutils、OP を許可して通常に戻すだけで十分です。
テルドン

それが「場合」と書いた理由です。パッケージcoreutilsにはスクリプトがありません。通常、ファイルを削除する必要がある場合など、ファイルが存在する場合または存在しない場合、インストール前およびインストール後のスクリプトはエラーで失敗します。はい、私はパッケージを事前に確認するのが面倒でした。

あなたもエミュレートすることができrmmv(「ゴミ箱」へ)
sendmoreinfo

14

私は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

8
場合はscp、その後、使用できませんnc(別名netcat、送信側と)bash/dev/tcp/HOST/PORT受信側のリダイレクトなどうまくいくかもしれません。
MvG 14

13

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パッケージをインストールすることをお勧めします。これは、他のすべてを壊しても動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.