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

168

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

sudo rm -f /bin/rm

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

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

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

user60684
источник
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разрешения для удаления / перемещения пакета.

Braiam
источник
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
NlightNFotis
источник
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
MathematicalOrchid
источник
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, который работает, даже если вы сломаете все остальное.

Дэн Мериллат
источник