Saya menghapus / bin / rm. Bagaimana cara memulihkannya?

168

Hanya untuk bersenang-senang, saya pikir saya akan menggunakan perintah ini pada Raspberry Pi saya menjalankan Raspbian:

sudo rm -f /bin/rm

Saya pikir saya bisa menginstal ulang coreutils: Saya salah!

apt-get install --reinstall coreutilsmemberikan kesalahan dari dpkg, mengatakan itu tidak bisa menghapus paket. Kompilasi dari sumber tidak berfungsi karena Makefilepenggunaannya rm.

Bagaimana saya bisa rmkembali bekerja ?

pengguna60684
sumber
9
Setiap .deb pada dasarnya adalah arsip yang bisa Anda ekstrak dan cukup salin file yang dapat dieksekusi ke / bin.
schaiba
1
OS apa ini? Linux? Unix? Sesuatu yang lain Kalau Linux, distro yang mana? 64bit? 32?
terdon
12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(atau /bin/busybox, atau ekstrak dari initrd)
Stéphane Chazelas
10
Raspberry Pi memiliki OS-nya pada kartu memori SD sehingga Anda bisa mengekstrak biner rm dari paket di komputer lain dan menyalinnya kembali ke kartu. Bagaimanapun, aksi lucu yang kamu lakukan di sana dan sangat berani untuk mengakuinya di depan umum :)
Christian
15
@ user645715 37 orang berpendapat pertanyaan ini lucu.
Brilliand

Jawaban:

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

Dan tidak akan pernah lagi.


Mengapa Anda tidak menggunakan sudo dengan apt-get?

Karena downloadperintah tidak memerlukannya:

download
unduhan akan mengunduh paket biner yang diberikan ke direktori saat ini.

Jadi, kecuali Anda berada di direktori yang tidak dapat Anda tulis, Anda tidak perlu menggunakannya sudo, dan itu bisa menjadi masalah di kemudian hari karena Anda akan memerlukan rootizin untuk menghapus / memindahkan paket.

Braiam
sumber
3
apt-get perlu dijalankan dengan sudo :)
AWippler
31
@AWippler no, dalam hal ini no.
Braiam
5
Perhatikan bahwa file eksekusi yang kosong dijalankan sebagai skrip shell yang tidak melakukan apa-apa. Jadi itu berarti memohon /bin/sh. Akan lebih mudah untuk melakukan sudo ln -s true /bin/rmatau bahkan lebih baik sudo ln -s busybox /bin/rmmemiliki pekerjaan rm.
Stéphane Chazelas
1
apt-getmemang membutuhkan sudo jika Anda belum mengunduh coreutils karena jika tidak, ia tidak akan bisa menulis ke /vartempat debian menyimpan file yang diunduh.
Kristopher Ives
3
@KristopherIves salah ... apt-getdownload paket ke direktori saat ini selalu (ya, bahkan jika Anda menggunakan sudo), jadi kecuali Anda berada di direktori Anda tidak dapat menulis sebagai pengguna Anda, Anda tidak perlu sudo. Silakan periksa halaman manual.
Braiam
106

debiandan turunannya (dan mungkin sebagian besar distribusi lainnya) datang dengan busyboxyang digunakan dalam initramfs.

busybox bundel sebagian besar utilitas baris perintah inti dalam satu executable.

Anda dapat sementara symlink /bin/rmke /bin/busybox:

ln -s busybox /bin/rm

Untuk mendapatkan pekerjaan rm(setelah itu Anda dapat melakukannya apt-get install --reinstall coreutils).

Metode yang sama dapat digunakan untuk semua utilitas lain yang busyboxtermasuk. Daftar itu bervariasi dari satu penempatan ke yang lain. Anda bisa mendapatkan daftarnya busybox --list.

Namun perlu dicatat bahwa mereka adalah versi terbatas dari utilitas yang sesuai. Terkadang mereka mendukung ekstensi GNU, tetapi umumnya tidak dan beberapa dari mereka bahkan tidak akan mendukung semua fitur standar / POSIX (beberapa fitur dapat diaktifkan / dinonaktifkan pada waktu kompilasi).

Atau, Anda dapat menggunakan zshbuilt-in rm:

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

The zsh/filesmodul menyediakan dengan beberapa perintah builtin tambahan ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync). Ini berguna dalam situasi seperti ini atau ketika Anda tidak dapat melakukan lebih banyak proses tetapi zshmenjalankan interaktif .

ksh93juga memiliki sejumlah tambahan / opsional perintah buitin, tetapi tidak rmdi antara mereka ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync). Anda dapat meminta mereka dengan:

command /opt/ast/bin/the-command

dalam ksh93naskah.

Stéphane Chazelas
sumber
5
Jawaban yang bagus Membuat saya bertanya-tanya apakah OP benar-benar perlu menginstal ulang yang asli rmsama sekali. ;-)
joeytwiddle
Memang. Sebenarnya, ini membuat saya berpikir untuk menghapus coreutils juga ... :-)
Damon
4
@Damon: coreutils menyediakan versi lanjutan dari perintah dasar dibandingkan dengan busybox, jadi sementara busybox mungkin cukup untuk mencocokkan persyaratan SUSv3, coreutils lebih berfitur; misalnya busybox memiliki dukungan i18n terbatas.
liori
2
@liori: Saya setengah bercanda, meskipun 10-15 tahun yang lalu, saya mungkin memang akan melakukannya dalam situasi itu ("fitur" tambahan, khususnya i18n , bukan merupakan keuntungan menurut pendapat saya - terjemahan yang tidak dapat dipahami, dan belajar menggunakan sakelar yang tiba-tiba memecah skrip di komputer lain, tidak, terima kasih). Namun, saat ini, saya senang jika hanya sistem Linux yang berjalan lancar diinstal tanpa saya menyentuh apa pun, dan tanpa harus memindahkan / menghapus / mengedit sistem / mengkonfigurasi file atau binari. Yang sayangnya, masih belum cukup sering terjadi, jadi saya pasti tidak menyentuh sesuatu yang bekerja :-)
Damon
29

Dalam kasus apt-getatau dpkgkebutuhan rmdan tanpa rminstalasi ulang tidak memungkinkan, maka Anda dapat meniru rmdengan perl:

cat > /bin/rm << "EOF"
#!/usr/bin/perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm
NlightNFotis
sumber
3
Perhatikan bahwa itu tidak menangani -r, dan fakta bahwa itu tidak mengembalikan status keluar yang benar dapat menyebabkan masalah.
Stéphane Chazelas
6
@StephaneChazelas itu sudah cukup untuk memungkinkan apt-get install --reinstall coreutilsdan mendapatkan OP kembali normal.
terdon
itu sebabnya saya menulis "seandainya". coreutils paket tidak memiliki skrip. biasanya skrip pra dan pasca pemasangan gagal pada kesalahan jika file ada atau tidak ada, misalnya jika perlu dihapus. Dan ya, memang benar saya terlalu malas untuk memeriksa paket terlebih dahulu.
Anda juga bisa meniru rmdengan mv(ke 'tempat sampah')
sendmoreinfo
14

Saya akan mencoba mendapatkan rmbiner yang benar dari komputer lain, dan kemudian menggunakan scpatau sesuatu untuk menyalinnya ke Pi. Ini tentu saja hanya berfungsi jika scpsudah diinstal ...

Jika scptidak tersedia, maka nc(alias netcat) di sisi pengirim dan bash dengan /dev/tcp/HOST/PORTpengalihan di sisi penerima mungkin bekerja juga.

Jika Anda tidak memiliki mesin Raspbian lain, Anda dapat mengambil paket coreutils (dapatkan .debuntuk versi yang tepat), dan membongkarnya dengan dpkg-deb(di Debian / Ubuntu / Mint / ..., bahkan jika itu bukan pada Pi):

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

Jika Anda tidak memiliki komputer lain dengan dpkg, Anda dapat mengekstrak file dengan ar(dari alat pengembangan binutils) dan tar:

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm
Matematika Matematika
sumber
8
Jika scptidak tersedia, maka nc(alias netcat) di sisi pengirim dan bashdengan /dev/tcp/HOST/PORTpengalihan di sisi penerima mungkin bekerja juga.
MvG
13

Karena ini debian (atau ubuntu), ada cara mudah untuk mendapatkan file:

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

Ini berfungsi karena apt-get mengunduh coreutils.deb sebelum mencoba menginstalnya, dan dpkg-deb dijamin ada pada sistem berbasis debian.

Jangan mengekstrak langsung ke / tmp, itu mengubah izin pada direktori induk.

Jika Anda ingin bermain-main, Anda mungkin ingin menginstal paket busybox-static, yang berfungsi bahkan jika Anda merusak semuanya.

Dan Merillat
sumber