Я видалив / bin / rm. Як я його відновити?


168

Просто для розваги, я думав, що буду використовувати цю команду на моєму Raspberry Pi під керуванням Raspbian:

sudo rm -f /bin/rm

Я думав, що можу просто перевстановити coreutils: я помилявся!

apt-get install --reinstall coreutilsвидає помилку dpkg, кажучи, що не вдалося видалити пакунок. Компіляція з джерела не працює, оскільки Makefileвикористовує rm.

Як я можу отримати робочу rmспину?


9
Кожен .deb - це архів, який ви можете розпакувати та просто скопіювати у виконаний файл / bin.
schaiba

1
Що це за ОС? Linux? Unix? Щось ще? Якщо Linux, який дистрибутив? 64 біт? 32?
terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(або /bin/busyboxвитягнути його з
інтриду

10
У Raspberry Pi є своя ОС на картці пам'яті SD, тому ви можете просто витягнути бінарний номер rm з пакету на іншій машині і скопіювати його назад на карту. У будь-якому випадку, веселий трюк, який ви натякали туди і дуже сміливо відпускаєте це публічно :)
Крістіан

15
@ user645715 37 людей вважали це питання кумедним.
Brilliand

Відповіді:


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

І більше ніколи.


Чому ви не використовували судо з apt-get?

Оскільки downloadкоманда цього не вимагає:

download
Завантаження завантажить даний двійковий пакет у поточний каталог.

Отже, якщо ви не знаходитесь в якомусь каталозі, який ви не можете написати, вам не потрібно користуватися sudo, і це може стати проблематичним пізніше, оскільки rootдля видалення / переміщення пакета вам знадобляться дозволи.


3
apt-get потрібно запускати з sudo :)
AWippler

31
@AWippler ні, в цьому випадку ні.
Брайам

5
Зауважте, що порожній виконуваний файл виконується як сценарій оболонки, який нічого не робить. Тож це означає викликати /bin/sh. Було б простіше зробити sudo ln -s true /bin/rmабо ще краще sudo ln -s busybox /bin/rmмати робочий rm.
Стефан Шазелас

1
apt-getВам потрібен sudo, якщо ви не завантажували coreutils, оскільки в іншому випадку він не зможе написати, /varкуди debian зберігає завантажені файли.
Крістофер Івз

3
@KristopherIves помиляється ... apt-getзавантажує пакунок у поточний каталог завжди (так, навіть якщо ви використовували sudo), тому, якщо ви не знаходитесь в каталозі, ви не можете писати як свого користувача, який вам не потрібен sudo. Будь ласка, перегляньте довідкові сторінки.
Брайам

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Модуль забезпечує кілька додаткових вбудованих команд ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync). Це корисно в таких ситуаціях або коли ви не можете розщедрити більше процесів, але в інтерактивному zshрежимі.

ksh93також має ряд додаткових / факультативна команд buitin, але не rmсеред них ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync). Ви можете викликати їх за допомогою:

command /opt/ast/bin/the-command

в ksh93сценарії.


5
Чудова відповідь. Мене змушує задуматися, чи дійсно ОП взагалі потребує перевстановлення реального rm. ;-)
joeytwiddle

Справді. Насправді це змушує мене також думати про видалення coreutils ... :-)
Деймон,

4
@Damon: coreutils надають розширену версію основних команд порівняно з zasedbox, тому, хоча zasedbox може бути достатньо, щоб відповідати вимогам SUSv3, coreutils є більш функціональними; наприклад, зайнятий сервіс має обмежену підтримку i18n.
liori

2
@liori: Я напівжартував, хоча 10-15 років тому я, мабуть, справді зробив би це в тій ситуації (додані "особливості", зокрема i18n , на мою думку, не є перевагою - нерозбірливі переклади, і навчитися користуватися перемикачами, які несподівано ламають скрипти на іншому комп’ютері, немає подяки). Однак сьогодні я щасливий, якщо лише система Linux працює безперебійно як встановлена, не торкаючись нічого, і не потребуючи переміщення / видалення / редагування системних / конфігураційних файлів чи двійкових файлів. Що, на жаль, все ще не так часто, тому я, безумовно, не зачіпаю те, що працює :-)
Деймон,

29

У випадку, apt-getякщо це dpkgпотребує rmі без rmперевстановлення це неможливо, то ви можете емулювати за rmдопомогою perl:

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

3
Зауважте, що він не працює -r, і той факт, що він не повертає правильний статус виходу, може спричинити проблеми.
Стефан Шазелас

6
@StephaneChazelas достатньо, щоб дозволити apt-get install --reinstall coreutilsі повернути ОП в норму.
terdon

тому я написав «на випадок». пакунок coreutils не має сценаріїв. Зазвичай сценарії до і після встановлення не спрацьовують з помилками, якщо файли існують або їх немає, наприклад, якщо їх потрібно видалити. І так, це правда, я лінувався перевірити пакунок заздалегідь.

ви також могли б емулювати rmз mv(до 'сміттєвого сміття')
sendmoreinfo

14

Я б спробував отримати правильний rmдвійковий файл з іншої машини, а потім скористатись scpчи іншим способом скопіювати його на Pi. Це, звичайно, працює лише в тому випадку, коли scpвін уже встановлений ...

Якщо scpвона недоступна, то nc(aka netcat) на стороні, що надсилає, і також /dev/tcp/HOST/PORTможе працювати з перенаправленням на стороні, що приймає.

Якщо у вас немає іншої машини Raspbian, ви можете отримати пакет coreutils (отримати .debпотрібну версію) та розпакувати його dpkg-deb(на Debian / Ubuntu / Mint /…, навіть якщо він не є на Pi):

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

Якщо у вас немає іншої машини з dpkg, ви можете витягти файл за arдопомогою інструментів розробки бінутів та tar:

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

8
Якщо scpйого немає, то nc(ака netcat) на стороні, що надсилає, і bashз /dev/tcp/HOST/PORTперенаправленням на сторону, що приймає, також може працювати.
MvG

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, це змінює дозволи на батьківський каталог.

Якщо ви збираєтеся пограти, ви, можливо, захочете встановити пакет зайнятий-статичний, який працює, навіть якщо ви порушите все інше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.