Я удалил / bin / rm. Как мне его восстановить?


168

Просто ради интереса, я подумал, что буду использовать эту команду на Raspberry Pi с Raspbian:

sudo rm -f /bin/rm

Я думал, что могу просто переустановить coreutils: я был неправ!

apt-get install --reinstall coreutilsвыдает ошибку dpkg, говоря, что не может удалить пакет. Компиляция из исходного кода не работает, потому что Makefileиспользует rm.

Как я могу получить работу rmобратно?


9
Каждый .deb - это, по сути, архив, который вы можете распаковать и просто скопировать исполняемый файл rm в / bin.
— Schaiba

1
Что это за ОС? Linux? Unix? Что-то другое? Если Linux, какой дистрибутив? 64bit? 32?
— Terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(или /bin/busyboxили извлеките его из initrd)
— Стефан Шазелас

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*

И никогда больше.


Почему вы не использовали sudo с apt-get?

Потому что downloadкоманда не требует этого:

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 загружает пакет в текущий каталог (да, даже если вы его использовали ), поэтому, если вы не находитесь в каталоге, вы не можете писать от имени пользователя, который вам не нужен . Пожалуйста, проверьте справочные страницы. sudosudo
— Брайам

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 ... :-)
— Damon

4
@Damon: coreutils предоставляют расширенную версию базовых команд по сравнению с busybox, так что хотя busybox может быть достаточно для соответствия требованиям SUSv3, coreutils более функциональны; например busybox имеет ограниченную поддержку i18n.
— Лиори

2
@liori: я был полушутя, хотя 10-15 лет назад я, вероятно, действительно сделал бы это в такой ситуации (дополнительные «особенности», в частности i18n , на мой взгляд, не являются преимуществом - неоправданные переводы и научиться использовать переключатели, которые неожиданно ломают скрипты на другом компьютере, нет, спасибо). Тем не менее, в настоящее время я рад, что только система Linux работает без сбоев, как я установил, не трогая меня и не перемещая / удаляя / редактируя системные / конфигурационные файлы или двоичные файлы. К сожалению, это все еще не так часто, так что я, конечно, не касаюсь того, что работает :-)
— Дэймон

28

В случае необходимости apt-getили без переустановки, вы можете эмулировать с помощью :dpkgrmrmrmperl

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и вернуть OP в нормальное состояние.
— Terdon

вот почему я написал "на всякий случай". пакет coreutils не имеет скриптов. как правило, сценарии до и после установки завершаются ошибкой, если файлы существуют или не существуют, например, если их необходимо удалить. И да, правда, мне было лень проверять посылку заранее.

Вы также можете эмулировать rmс mv(«мусорное ведро»)
— sendmoreinfo

14

Я попытался бы получить правильный rmдвоичный файл с другой машины, а затем использовать scpили что-то, чтобы скопировать его в Pi. Это, конечно, работает только если scpуже установлено ...

Если scpнедоступно, то nc(aka netcat) на отправляющей стороне и bash с /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(из инструментов разработки binutils) и tar:

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

8
Если scpнет, то nc(aka 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, это меняет права на родительский каталог.

Если вы собираетесь поиграть, вы можете установить пакет busybox-static, который работает, даже если вы сломаете все остальное.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.