/ Bin / rm sildim. Nasıl kurtarırım?


168

Sadece eğlence için, bu komutu Raspbian Pi çalıştıran Ahududu Pi'mde kullanacağımı düşündüm:

sudo rm -f /bin/rm

Yeniden kurabileceğimi düşündüm coreutils: yanılmışım!

apt-get install --reinstall coreutilsdpkgpaketi kaldıramadığını söyleyerek bir hata veriyor . Kaynaktan derlemek işe yaramaz çünkü Makefilekullanır rm.

Nasıl rmgeri dönebilirim?


9
Her .deb temelde paketten çıkarabileceğiniz ve rm çalıştırılabilir dosyasını / bin dizinine kopyalayabileceğiniz bir arşivdir.
schaiba

1
Bu işletim sistemi nedir? Linux? Unix? Başka bir şey? Eğer Linux, hangi dağıtmak? 64bit? 32?
terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(veya /bin/busybox, veya bir
initrd'den

10
Raspberry Pi'nin işletim sistemi SD hafıza kartındadır, böylece rm ikilisini paketten başka bir makinede çıkarabilir ve tekrar karta kopyalayabilirsiniz. Her durumda, o komik çıldırmış dublör oraya çekti ve kamuya itiraf etmek için çok cesurca :)
Christian

15
@ user645715 37 kişi bu soruyu eğlenceli buldu.
Brilliand

Yanıtlar:


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

Ve bir daha asla.


Neden apt-get ile sudo kullanmadınız?

Çünkü downloadkomut gerektirmiyor:

download
indir, verilen ikili paketi geçerli dizine indirir .

Bu nedenle, yazamayacağınız bir dizinde olmadığınız sürece, kullanmanıza gerek kalmaz sudove daha sonra sorun rootçıkartabilir çünkü paketi kaldırmak / taşımak için izinlere ihtiyacınız olacaktır .


3
apt-get sudo ile çalıştırılması gerekiyor :)
AWippler

31
@Awippler hayır, bu durumda hayır.
Braiam,

5
Boş bir çalıştırılabilir dosyanın hiçbir şey yapmayan bir kabuk betiği olarak yürütüldüğünü unutmayın. Yani bu çağrı yapmak demektir /bin/sh. Bir yapmak daha basit olurdu sudo ln -s true /bin/rmveya daha iyi sudo ln -s busybox /bin/rmbir çalışma olması rm.
Stéphane Chazelas

1
apt-getcoreutils'i indirmediyseniz sudo’ya ihtiyaç duymaz çünkü aksi takdirde debian’ın /varindirilen dosyaları kaydettiği yere yazamaz .
Kristopher Ives,

3
@KristopherIves yanlış ... apt-getpaketi her zaman geçerli dizine indirir (evet, kullanmış olsanız bile sudo), bu nedenle bir dizinde olmadığınız sürece, kullanıcı olarak ihtiyacınız olmayan bir şeyi yazamazsınız sudo. Lütfen man sayfalarını kontrol edin.
Braiam

106

debianve türevleri (ve muhtemelen çoğu diğer dağılımları) busyboxiçinde kullanılanlarla birlikte gelir initramfs.

busybox çekirdek komut satırı uygulamalarının çoğunu tek bir çalıştırılabilir dosyada toplar.

Geçici olarak sembolik bir link edebilirsiniz /bin/rmiçin /bin/busybox:

ln -s busybox /bin/rm

Çalışmak için rm(bundan sonra yapabilecekleriniz apt-get install --reinstall coreutils).

Aynı yöntem, busyboxiçerdiği diğer tüm yardımcı programlar için kullanılabilir . Bu liste bir dağıtımdan diğerine değişir. Listeyi alabilirsiniz busybox --list.

Ancak, bunlara karşılık gelen yardımcı programların sınırlı sürümleri olduğuna dikkat edin. Bazen GNU uzantılarını destekliyorlar, ancak genellikle değil ve bazıları tüm standart / POSIX özelliklerini bile desteklemeyecek (bazı özellikler derleme zamanında etkinleştirilebilir / devre dışı bırakılabilir).

Alternatif olarak, zshyerleşik rm kullanabilirsiniz:

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

zsh/filesModül birkaç ek yerleşik komutlarıyla sağlar ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync). Bu tür durumlarda veya daha fazla işlem yapamadığınızda ancak etkileşimli bir zshçalışma yaptığınızda faydalıdır .

ksh93Ayrıca ancak, ekstra / opsiyonel komutlar buitin bir numarası vardır rmaralarında ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync). Onları şu şekilde çağırabilirsiniz:

command /opt/ast/bin/the-command

Bir ksh93komut dosyasında.


5
Mükemmel cevap. OP'nin gerçekten gerçeği tekrar kurması gerekip gerekmediğini merak ediyorum rm. ;-)
joeytwiddle

Aslında. Aslında, bu da benim çekirdek çekirdeklerin silinmesini düşünmemi sağlıyor ... :-)
Damon

4
@Damon: coreutils, busybox'a kıyasla temel komutların genişletilmiş bir sürümünü sağlar, böylece busybox SUSv3 gereksinimlerini karşılamak için yeterli olsa da, coreutils daha özelliklidir; örneğin busybox i18n desteği sınırlıdır.
liori

2
@liori: Ben yarı şaka yapıyordum, ancak 10-15 yıl önce, muhtemelen gerçekten de bu durumda yapardım (eklenmiş "özellikler", özellikle i18n , benim görüşüme göre bir avantaj değil - söylenemez çeviriler ve beklenmedik bir şekilde başka bir bilgisayarda komut dosyalarını kıran anahtarları kullanmayı öğrenmek, hayır, teşekkürler). Bununla birlikte, bugünlerde, bir Linux sistemi benden herhangi bir şeye dokunmadan ve sistem / config dosyalarını veya ikili dosyalarını taşımak / silmek / düzenlemek zorunda kalmadan sorunsuz bir şekilde çalışırsa, mutluyum. Ne yazık ki, hala durum yeterince sık değil, bu yüzden kesinlikle çalışan bir şeye dokunmuyorum kesinlikle :-)
Damon

29

Durumunda apt-getveya dpkgihtiyaçlara rmve olmadan rmbir yeniden yükleme çekilse değil, o zaman taklit edebilir rmile perl:

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

3
İşe yaramadığını -rve doğru bir çıkış durumu döndürmemesi sorunlara yol açabileceğini unutmayın.
Stéphane Chazelas

6
@StephaneChazelas apt-get install --reinstall coreutils, OP'nin normale dönmesi için izin vermek ve yeterlidir .
terdon

bu yüzden "davada" yazdım. paket coreutils'in komut dosyaları yoktur. tipik olarak, eğer dosyalar varsa ya da yoklarsa, örneğin kaldırılmaları gerektiğinde, kurulum öncesi ve sonrası komut dosyaları hatalarda başarısız olur. Ve evet, paketi önceden kontrol etmek için çok tembel olduğum doğru.

ayrıca ('çöp kutusuna') rmile de öykünebilirsinmv
sendmoreinfo

14

rmBaşka bir makineden doğru binary elde etmeye çalışacağım ve daha sonra scpPi'ye kopyalamak için bir şey kullanacağım. Bu, elbette yalnızca scpönceden kuruluysa çalışır ...

Eğer scpmevcut değilse nc, gönderen taraftaki (aka netcat) /dev/tcp/HOST/PORTve alıcı taraftaki yeniden yönlendirmeyle bash de çalışabilir.

Başka bir Raspbian makineniz yoksa, coreutils paketini alabilir ( .debdoğru sürümü bulmak için) ve paketten çıkarabilirsiniz dpkg-deb(Debian / Ubuntu / Mint /…, Pi'de olmasa bile):

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

Dpkg ile başka bir makineniz yoksa, dosyayı ar(binutils geliştirme araçlarından) ve tar ile açabilirsiniz :

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

8
Eğer scpo zaman, mevcut değildir nc(aka netcatgönderen tarafında ve) bashbir ile /dev/tcp/HOST/PORTalıcı tarafında yönlendirme de işe yarayabilir.
MvG

13

Debian (veya ubuntu) olduğundan, dosyaları almanın kolay bir yolu var:

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

Bu, apt-get'in yüklemeye çalışmadan önce coreutils.deb dosyasını indirmesi ve dpkg-deb dosyasının debian tabanlı bir sistemde varolması nedeniyle çalıştığı için işe yarıyor.

Doğrudan / tmp dosyasına ayıklama, ana dizindeki izinleri değiştirir.

Oyun oynayacaksanız, diğer her şeyi bozsanız bile çalışan busybox-static paketini kurmak isteyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.