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


168

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

sudo rm -f /bin/rm

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

apt-get install --reinstall coreutils从给出了一个错误dpkg,说它无法删除该软件包。由于Makefile使用,无法从源代码进行编译rm

我该如何找回工作rm


9
每个.deb基本上都是一个存档,您可以解压缩并将rm可执行文件简单复制到/ bin。
schaiba 2014年

1
这是什么操作系统?Linux的?Unix?还有别的吗 如果是Linux,哪个发行版?64位?32?
terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(或/bin/busybox,或从一个initrd提取它)
斯特凡Chazelas

10
Raspberry Pi的操作系统位于SD存储卡上,因此您只需从另一台计算机上的软件包中提取rm二进制文件,然后将其复制回该卡即可。无论如何,您都热闹的特技被拉到了那里,并且您大胆地公开承认了它:)
Christian

15
@ user645715 37个人发现此问题很有趣。
Brilliand 2014年

Answers:


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不,在这种情况下不。
Braiam 2014年

5
请注意,一个空的可执行文件将作为不执行任何操作的Shell脚本执行。因此,这意味着调用/bin/sh。做一个工作会更加简单,sudo ln -s true /bin/rm甚至更好。sudo ln -s busybox /bin/rmrm
斯特凡Chazelas

1
apt-get如果您尚未下载coreutils,则确实需要sudo,因为否则它将无法写入/vardebian保存已下载文件的位置。
Kristopher Ives

3
@KristopherIves错误... 总是apt-get将程序包下载到当前目录(是的,即使您使用过),因此,除非您位于目录中,否则您将无法以不需要的用户身份进行编写。请检查手册页。sudosudo
Braiam 2014年

106

debian及其衍生品(可能还有其他大多数分布)随随busyboxinitramfs

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模块与几个额外的内置命令提供(rmmvlnmkdirrmdirchownchmodsync)。在这种情况下,或者当您不能派生更多进程但需要交互式zsh运行时,它很有用。

ksh93也有一些额外的/可选命令buitin,而不是rm其中(basenamechmoddirnamegetconfheadmkdirlognamecatcmpcutunamewcsync)。您可以使用以下命令调用它们:

command /opt/ast/bin/the-command

ksh93脚本中。


5
好答案。让我想知道OP是否真的需要重新安装Real rm。;-)
joeytwiddle 2014年

确实。实际上,这也让我考虑删除coreutils ... :-)
Damon 2014年

4
@Damon:与busybox相比,coreutils提供了基本命令的扩展版本,因此尽管busybox足以满足SUSv3要求,但coreutils更具功能;例如busybox的i18n支持有限。
liori 2014年

2
@liori:我开玩笑了,尽管10到15年前,在那种情况下我可能确实做到了(我认为添加的“功能”,尤其是i18n并不是优势-难以理解的翻译,以及学习使用会意外破坏另一台计算机上的脚本的开关,不用了,谢谢。但是,如今,如果仅Linux系统在安装时运行平稳,而又无需触摸任何东西,又无需移动/删除/编辑系统/配置文件或二进制文件,我将感到非常高兴。令人遗憾的是,这种情况仍然不够多,因此我肯定不会碰到任何有效的方法 :-)
Damon

29

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

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

3
请注意,它不会处理-r,并且它不会返回正确的退出状态这一事实可能会导致问题。
斯特凡Chazelas

6
@StephaneChazelas足以让apt-get install --reinstall coreutilsOP恢复正常。
terdon

这就是为什么我写“以防万一”的原因。软件包coreutils没有脚本。通常,如果文件存在或不存在(例如,如果需要删除它们),则安装前和安装后脚本会因错误而失败。是的,的确,我懒得提前检查包裹。

您也可以rm使用mv(模仿“垃圾箱”)
sendmoreinfo 2014年

14

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

如果scp不可用,则nc发送方(aka 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

如果您没有另一台使用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 2014年

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软件包,即使您破坏了其他所有内容,该软件包也可以使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.