我删除了/bin/rm。我该如何恢复?

use*_*684 173 command-line dpkg rm

只是为了好玩,我想我会在运行 Raspbian 的 Raspberry Pi 上使用这个命令:

sudo rm -f /bin/rm
Run Code Online (Sandbox Code Playgroud)

我以为我可以重新安装coreutils:我错了!

apt-get install --reinstall coreutils给出了一个错误dpkg,说它无法删除包。从源代码编译不起作用,因为Makefile使用rm.

我怎样才能找回工作rm

Bra*_*iam 196

sudo touch /bin/rm && sudo chmod +x /bin/rm
apt-get download coreutils
sudo dpkg --unpack coreutils*
Run Code Online (Sandbox Code Playgroud)

再也不会了。


为什么不将 sudo 与 apt-get 一起使用?

因为download命令不需要它:

download
download 会将给定的二进制包下载到当前目录中。

因此,除非您位于某个无法写入的目录中,否则您不需要使用sudo,并且稍后可能会出现问题,因为您需要root删除/移动包的权限。

  • @AWippler 不,在这种情况下不。 (32认同)
  • 请注意,空的可执行文件作为 shell 脚本执行,什么也不做。所以这意味着调用`/bin/sh`。执行 `sudo ln -s true /bin/rm` 甚至更好的 `sudo ln -s busybox /bin/rm` 会更简单,以获得有效的 `rm`。 (7认同)
  • apt-get 需要使用 sudo 运行 :) (3认同)
  • @KristopherIves 错了... `apt-get` 总是将包下载到当前目录*(是的,即使你使用了 `sudo`),所以除非你在一个目录中,否则你不能像你的用户那样写不需要`sudo`。请检查手册页。 (3认同)

Sté*_*las 108

debian及其衍生物(可能还有大多数其他发行版)随附busyboxinitramfs.

busybox 将大多数核心命令行实用程序捆绑在一个可执行文件中。

您可以临时符号链接/bin/rm/bin/busybox

ln -s busybox /bin/rm
Run Code Online (Sandbox Code Playgroud)

得到一份工作rm(之后你可以做你的apt-get install --reinstall coreutils)。

相同的方法可用于包含的所有其他实用程序busybox。该列表因部署而异。您可以使用busybox --list.

但是请注意,它们是相应实用程序的有限版本。它们有时支持 GNU 扩展,但通常不支持,其中一些甚至不支持所有标准/POSIX 功能(某些功能可以在编译时启用/禁用)。

或者,您可以使用zsh的内置 rm:

#! /bin/zsh
zmodload zsh/files
rm "$@"
Run Code Online (Sandbox Code Playgroud)

zsh/files模块提供了一些额外的内置命令(rmmvlnmkdirrmdirchownchmodsync)。它在这种情况下很有用,或者当您不能分叉更多进程但确实有交互式zsh运行时。

ksh93也有许多额外/可选的命令 buitin,但不在rm其中(basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync)。您可以通过以下方式调用它们:

command /opt/ast/bin/the-command
Run Code Online (Sandbox Code Playgroud)

ksh93脚本中。

  • 很好的答案。让我想知道 OP 是否真的需要重新安装真正的 `rm`。;-) (5认同)
  • @Damon:与busybox 相比,coreutils 提供了基本命令的扩展版本,因此虽然busybox 可能足以满足SUSv3 要求,但coreutils 功能更强大;例如,busybox 对 i18n 的支持有限。 (4认同)
  • @liori:我是半开玩笑的,虽然在 10-15 年前,我可能确实会在那种情况下这样做(添加的“功能”,尤其是 i18n_,在我看来并不是一个优势——难以理解的翻译,以及学习使用意外破坏另一台计算机上的脚本的开关,不,谢谢)。然而,如今,如果只有 Linux 系统在安装时顺利运行而我无需接触任何东西,并且无需移动/删除/编辑系统/配置文件或二进制文件,我会很高兴。可悲的是,情况仍然不够频繁,所以我肯定不会碰_有用的东西_ :-) (2认同)

小智 29

在情况apt-getdpkg需求rm,并没有rm重新安装不posssible,那么你可以模拟rmperl

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

  • @StephaneChazelas 允许`apt-get install --reinstall coreutils` 并让 OP 恢复正常就足够了。 (6认同)
  • 请注意,它不处理 `-r`,并且它不返回正确的退出状态的事实可能会导致问题。 (3认同)

Mat*_*hid 14

我会尝试rm从另一台机器获取正确的二进制文件,然后使用scp或其他东西将其复制到 Pi。这当然只有在scp已经安装的情况下才有效......

如果scp不可用,则nc发送端的(又名 netcat)和/dev/tcp/HOST/PORT接收端重定向的bash也可能工作。

如果您没有另一台 Raspbian 机器,您可以检索coreutils 包(获取.deb正确版本的),并使用dpkg-deb(在 Debian/Ubuntu/Mint/... 上,即使它不在 Pi 上)解压它:

dpkg-deb --fsys-tarfile coreutils*.deb | tar xf - ./bin/rm
Run Code Online (Sandbox Code Playgroud)

如果您没有另一台带有 dpkg 的机器,您可以使用ar(来自 binutils 开发工具)和 tar提取文件:

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm
Run Code Online (Sandbox Code Playgroud)

  • 如果`scp` 不可用,那么发送端的`nc`(又名`netcat`)和接收端带有`/dev/tcp/HOST/PORT` 重定向的`bash` 也可能工作。 (8认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为 apt-get 在尝试安装之前下载了 coreutils.deb,并且 dpkg-deb 保证存在于基于 debian 的系统上。

不要直接解压到 /tmp,它会更改父目录的权限。

如果你打算玩,你可能想要安装包 busybox-static,即使你破坏了其他一切,它也能工作。