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

Вопрос или проблема

Просто ради забавы, я решил использовать эту команду на своем 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 (Возможности восстановления)

  1. Использование busybox:
    busybox — это набор утилит UNIX в одном исполняемом файле, который может предложить базовую версию команды rm. Для временного решения проблемы можно создать символическую ссылку:

    ln -s busybox /bin/rm

    После этого можно попробовать снова переустановить coreutils.

  2. Создание скрипта на Perl:
    Можно создать временный скрипт на Perl, который эмулирует поведение rm:

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

    Это позволит apt-get и другим утилитам выполнять свои функции.

  3. Распаковка 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 (Технические шаги)

  1. Используйте busybox для временного решения.
  2. Альтернативно, создайте скрипт на Perl.
  3. Или используйте dpkg-deb для извлечения из архива.
  4. Убедитесь, что ваш файл rm возвращен и правильно работает, проведите систему через переразмещение пакетов для восстановления всех зависимостей.

Следуя данной инструкции, вы сможете вернуть rm в рабочее состояние, минимизируя риски и обеспечивая стабильную работу вашего Raspbian-системы.

Оцените материал
Добавить комментарий

Капча загружается...