Вопрос или проблема
Просто ради забавы, я решил использовать эту команду на своем Raspberry Pi с Raspbian:
sudo rm -f /bin/rm
Я думал, что могу просто переустановить coreutils
: я ошибся!
apt-get install --reinstall coreutils
выдает ошибку от dpkg
, говоря, что не удалось удалить пакет. Компиляция из исходников не работает, потому что в Makefile
используется rm
.
Как мне вернуть рабочую версию rm
?
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
для удаления/перемещения пакета.
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
также имеет ряд дополнительных/опциональных встроенных команд, но не rm
среди них, если он не построен как часть ast-open, что в наши дни встречается редко. Ранее это были basename
, chmod
, dirname
, getconf
, head
, mkdir
, logname
, cat
, cmp
, cut
, uname
, wc
, sync
, но список был изменен в 2021 году, когда некоторые были удалены, а добавлены cp
, ln
, mv
, но все еще не rm
. Вы можете вызывать их с помощью:
command /opt/ast/bin/the-command
в скрипте ksh93
или вызвать builtin the-command
, чтобы встроенная команда the-command
была активирована и заменила внешнюю.
Если apt-get
или dpkg
нуждаются в rm
, и без rm
переустановка невозможна, то вы можете эмулировать rm
с помощью perl
:
cat > /bin/rm << "EOF"
#!/usr/bin/perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm
Поскольку это 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, который работает даже если вы повредили все остальное.
Я бы попробовал получить правильный бинарный файл rm
с другой машины, а затем с помощью scp
или другой программы скопировал бы его на Pi. Конечно, это сработает только если scp
уже установлен…
Если scp
недоступен, то nc
(также известный как 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
.
Ответ или решение
Восстановление утилиты rm
после её случайного удаления является насущной задачей для пользователя Raspbian на Raspberry Pi. Очень важно подходить к этому вопросу тщательно и аккуратно, чтобы вернуть систему в рабочее состояние. Рассмотрим несколько действенных методов для решения этой проблемы.
F – Features (Особенности проблемы)
Удаление /bin/rm
, одной из ключевых утилит, может вызвать значительные затруднения, поскольку многие процессы и сборки полагаются на наличие этой команды. Попытки переустановить пакет coreutils
с помощью apt-get install --reinstall coreutils
могли не удастся, так как самой утилиты rm
у нас уже нет, и удаление пакета без неё становится сложной задачей.
O – Opportunities (Возможности восстановления)
-
Использование
busybox
:
busybox
— это набор утилит UNIX в одном исполняемом файле, который может предложить базовую версию командыrm
. Для временного решения проблемы можно создать символическую ссылку:ln -s busybox /bin/rm
После этого можно попробовать снова переустановить
coreutils
. -
Создание скрипта на Perl:
Можно создать временный скрипт на Perl, который эмулирует поведениеrm
:cat > /bin/rm << "EOF" #!/usr/bin/perl foreach (@ARGV) { unlink $_ or warn "$@:$!"; } EOF chmod +x /bin/rm
Это позволит
apt-get
и другим утилитам выполнять свои функции. -
Распаковка deb-пакета вручную:
Используя уже загруженный файл.deb
дляcoreutils
, можно вручную извлечь нужный файл:mkdir /tmp/coreutils sudo dpkg-deb --extract /var/cache/apt/archives/coreutils_*.deb /tmp/coreutils sudo cp /tmp/coreutils/bin/rm /bin
R – Risks (Риски и предостережения)
-
Ограниченные возможности busybox: У него может не быть всех возможностей полной версии
rm
, что может не совсем подойти для некоторых скриптов или процессов. -
Ручная установка и конфигурация: Убедитесь, что вы извлекаете файл в правильное место и с нужными правами доступа, иначе это может вызвать дополнительные проблемы.
E – Events (События побочные)
Если у вас есть другой Linux-устройство (или виртуальная машина), на котором установлен coreutils
, можно перенести rm
с помощью scp
или другого средства передачи файлов. Это решит проблему более простым и надежным способом.
S – Solution (Оптимальное решение)
Наиболее комплексным методом является ручное извлечение rm
из deb-пакета и его правильная установка в систему. Это гарантирует восстановление всех функций утилиты в соответствии с её штатной работой.
T – Tactics (Технические шаги)
- Используйте
busybox
для временного решения. - Альтернативно, создайте скрипт на Perl.
- Или используйте
dpkg-deb
для извлечения из архива. - Убедитесь, что ваш файл
rm
возвращен и правильно работает, проведите систему через переразмещение пакетов для восстановления всех зависимостей.
Следуя данной инструкции, вы сможете вернуть rm
в рабочее состояние, минимизируя риски и обеспечивая стабильную работу вашего Raspbian-системы.