Я видалив / 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.