Usunąłem / bin / rm. Jak mogę to odzyskać?


168

Dla zabawy pomyślałem, że użyję tego polecenia na moim Raspberry Pi z systemem Raspbian:

sudo rm -f /bin/rm

Myślałem, że mogę po prostu ponownie zainstalować coreutils: Myliłem się!

apt-get install --reinstall coreutilspodaje błąd z informacją dpkg, że nie można usunąć pakietu. Kompilacja ze źródła nie działa, ponieważ Makefileużywa rm.

Jak mogę odzyskać pracę rm?


9
Każdy plik .deb jest w zasadzie archiwum, które można rozpakować i po prostu skopiować plik wykonywalny rm do / bin.
schaiba

1
Co to za system operacyjny? Linux? Unix? Coś innego? Jeśli Linux, która dystrybucja? 64bit? 32?
terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(lub /bin/busyboxwyodrębnij go z initrd)
Stéphane Chazelas

10
Raspberry Pi ma system operacyjny na karcie pamięci SD, więc możesz po prostu wyodrębnić plik binarny rm z pakietu na innym komputerze i skopiować go z powrotem na kartę. W każdym razie, przezabawna sztuczka, którą tam pociągnąłeś i bardzo odważna, by przyznać się do niej publicznie :)
Christian

15
@ user645715 37 osób uznało to pytanie za zabawne.
Brilliand

Odpowiedzi:


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

I nigdy więcej.


Dlaczego nie użyłeś sudo z apt-get?

Ponieważ downloadpolecenie tego nie wymaga:

download
download pobierze dany pakiet binarny do bieżącego katalogu.

Tak więc, chyba że znajdujesz się w jakimś katalogu, w którym nie możesz pisać, nie musisz go używać sudo, a może to stać się problematyczne później, ponieważ będziesz potrzebować rootuprawnień do usunięcia / przeniesienia pakietu.


3
apt-get musi być uruchamiany z sudo :)
AWippler

31
@AWippler nie, w tym przypadku nie.
Braiam

5
Zauważ, że pusty plik wykonywalny jest wykonywany jako skrypt powłoki, który nic nie robi. To oznacza przywoływanie /bin/sh. Byłoby łatwiej zrobić a sudo ln -s true /bin/rmnawet lepiej sudo ln -s busybox /bin/rmmieć pracę rm.
Stéphane Chazelas,

1
apt-getpotrzebuje sudo, jeśli nie pobrałeś coreutils, ponieważ w przeciwnym razie nie będzie mógł pisać w /varmiejscu, w którym debian zapisuje pobrane pliki.
Kristopher Ives

3
@KristopherIves źle ... apt-getpobiera pakiet do bieżącego katalogu zawsze (tak, nawet jeśli używane sudo), więc jeśli jesteś w katalogu nie można zapisać jako użytkownik nie trzeba sudo. Sprawdź strony podręcznika.
Braiam

106

debiani jego pochodne (i prawdopodobnie większość innych dystrybucji) pochodzą z tego, busyboxco jest używane w initramfs.

busybox łączy większość podstawowych narzędzi wiersza poleceń w jednym pliku wykonywalnym.

Możesz tymczasowo utworzyć dowiązanie symboliczne /bin/rmdo /bin/busybox:

ln -s busybox /bin/rm

Aby uzyskać pracę rm(po której możesz zrobić apt-get install --reinstall coreutils).

Tej samej metody można użyć do wszystkich innych narzędzi, które busyboxobejmuje. Ta lista różni się w zależności od wdrożenia. Możesz uzyskać listę za pomocą busybox --list.

Należy jednak pamiętać, że są to ograniczone wersje odpowiednich narzędzi. Czasami obsługują rozszerzenia GNU, ale generalnie nie, a niektóre z nich nawet nie obsługują wszystkich standardowych funkcji / POSIX (niektóre funkcje można włączyć / wyłączyć w czasie kompilacji).

Alternatywnie możesz użyć zshwbudowanego rm:

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

zsh/filesModuł zawiera z kilku dodatkowych poleceń wbudowanych ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync). Jest to przydatne w takiej sytuacji lub gdy nie można rozwidlić większej liczby procesów, ale zshdziała się interaktywnie .

ksh93posiada również szereg dodatkowych poleceń buitin / opcjonalny, ale nie rmmiędzy nimi ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync). Możesz je wywoływać za pomocą:

command /opt/ast/bin/the-command

w ksh93skrypcie.


5
Świetna odpowiedź. Zastanawiam się, czy OP naprawdę musi rmw ogóle ponownie instalować prawdziwy . ;-)
joeytwiddle

W rzeczy samej. Właściwie to sprawia, że ​​myślę o usunięciu coreutils ... :-)
Damon

4
@Damon: coreutils zapewniają rozszerzoną wersję podstawowych poleceń w porównaniu do busybox, więc chociaż busybox może wystarczyć do spełnienia wymagań SUSv3, coreutils są bardziej funkcjonalne; na przykład busybox ma ograniczoną obsługę i18n.
liori

2
@liori: Żartowałem na wpół, chociaż 10-15 lat temu zapewne zrobiłbym to w tej sytuacji (dodane „funkcje”, w szczególności i18n , moim zdaniem nie są zaletą - niezrozumiałe tłumaczenia i nauka używania przełączników, które nieoczekiwanie psują skrypty na innym komputerze, nie, dziękuję). Jednak w dzisiejszych czasach cieszę się, że tylko system Linux działa bezproblemowo po zainstalowaniu, bez dotykania czegokolwiek i bez konieczności przenoszenia / usuwania / edycji plików / plików systemowych lub plików binarnych. Co niestety wciąż nie zdarza się często, więc na pewno nie dotykam czegoś, co działa :-)
Damon

29

W przypadku potrzeby apt-getlub bez ponownej instalacji nie jest możliwe, możesz emulować za pomocą :dpkgrmrmrmperl

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

3
Zauważ, że nie obsługuje -r, a fakt, że nie zwraca poprawnego statusu wyjścia, może powodować problemy.
Stéphane Chazelas

6
@StephaneChazelas wystarczy pozwolić apt-get install --reinstall coreutilsi przywrócić OP do normy.
terdon

dlatego napisałem „na wszelki wypadek”. pakiet coreutils nie ma skryptów. zazwyczaj skrypty przed instalacją i po instalacji nie działają w przypadku błędów, jeśli pliki istnieją lub nie istnieją, na przykład jeśli trzeba je usunąć. I tak, to prawda, że ​​byłem zbyt leniwy, aby z góry sprawdzić paczkę.

możesz także emulować za rmpomocą mv(do „kosza na śmieci”)
sendmoreinfo

14

Spróbowałbym uzyskać poprawny rmplik binarny z innej maszyny, a następnie użyć scplub czegoś takiego, aby skopiować go do Pi. To oczywiście działa tylko wtedy, gdy scpjest już zainstalowane ...

Jeśli scpnie jest dostępny, to nc(aka netcat) po stronie wysyłającej i bash z /dev/tcp/HOST/PORTprzekierowaniem po stronie odbierającej mogą również działać.

Jeśli nie masz innej maszyny Raspbian, możesz pobrać pakiet coreutils (uzyskać .debodpowiednią wersję) i rozpakować go za pomocą dpkg-deb(na Debian / Ubuntu / Mint /…, nawet jeśli nie jest to Pi):

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

Jeśli nie masz innej maszyny z dpkg, możesz wyodrębnić plik za pomocą ar(z narzędzi programistycznych binutils) i tar:

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

8
Jeśli scpnie jest dostępny, a następnie nc(aka netcat) po stronie wysyłającej i bashz /dev/tcp/HOST/PORTprzekierowaniem na stronie odbiorczej może pracować jako dobrze.
MvG

13

Ponieważ jest to debian (lub ubuntu), istnieje prosty sposób na uzyskanie plików:

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

Działa to, ponieważ apt-get pobrał plik coreutils.deb przed próbą jego instalacji, a dpkg-deb gwarantuje, że istnieje w systemie opartym na Debianie.

Nie wypakowuj bezpośrednio do / tmp, zmienia to uprawnienia do katalogu nadrzędnego.

Jeśli zamierzasz się pobawić, możesz zainstalować pakiet busybox-static, który działa, nawet jeśli zepsujesz wszystko inne.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.