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

sudo rm -f /bin/rm


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

apt-get install --reinstall coreutils提供了来自dpkg的错误,表示无法删除该软件包。无法从源代码进行编译,因为Makefile使用了rm

如何才能恢复正常的rm

评论

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

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

ln -s / usr / lib / initramfs-tools / bin / busybox / bin / rm(或/ bin / busybox,或从initrd中提取)

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

@ user645715 37个人发现此问题很有趣。

#1 楼

sudo touch /bin/rm && sudo chmod +x /bin/rm
apt-get download coreutils
sudo dpkg --unpack coreutils*


再也没有。



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


因为download命令不需要它:


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


因此,除非您在某个目录中无法编写,否则不需要使用sudo,以后可能会出现问题,因为您需要root权限才能删除/移动软件包。

评论


apt-get需要使用sudo运行:)

– AWippler
14年2月18日在17:36

@AWippler不,在这种情况下不。

–脑袋
14年2月18日在22:14

请注意,一个空的可执行文件将作为不执行任何操作的Shell脚本执行。因此,这意味着调用/ bin / sh。进行sudo ln -s true / bin / rm或更简单的sudo ln -s busybox / bin / rm拥有工作rm会更简单。

–StéphaneChazelas
2014年2月20日在9:59

如果您尚未下载coreutils,则apt-get确实需要sudo,因为否则它将无法写入/ var,debian将保存下载的文件。

–克里斯托弗·艾夫斯(Kristopher Ives)
14年2月21日在23:08

@KristopherIves错误... apt-get总是将程序包下载到当前目录(是的,即使您使用sudo),因此,除非您在目录中,否则您不能以用户身份编写,就不需要sudo。请检查手册页。

–脑袋
2014年2月21日在23:12

#2 楼

debian及其衍生版本(以及可能的大多数其他发行版)与busybox一起使用。initramfs用于busybox

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

您可以暂时将/bin/busybox链接到rm

ln -s busybox /bin/rm


要正常工作apt-get install --reinstall coreutils(之后可以执行busybox)。

同样的方法可用于busybox --list包括的所有其他实用程序。该列表因一个部署而异。您可以使用zsh获得该列表。

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

#! /bin/zsh
zmodload zsh/files
rm "$@"


mv模块提供了一些附加的内置命令(lnmkdirrmdirchownchmodsynczshksh93)。在这种情况下,或者当您不能派生更多进程但确实要运行交互式rm时,它很有用。

basename还具有许多额外的/可选的命令buitin,但其中没有chmoddirnamegetconfheadmkdirlognamecatcmpcutunamewcsyncksh93,q4312079q)。您可以使用以下命令调用它们:

command /opt/ast/bin/the-command


在q4312079q脚本中。

评论


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

– joeytwiddle
2014年2月19日在17:19

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

–达蒙
2014年2月20日在16:05

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

– liori
2014年2月20日在22:50

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

–达蒙
2014年2月21日在13:21

#3 楼

如果apt-getdpkg需要rm而没有rm,则无法重新安装,则可以使用rm模拟perl

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


评论


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

–StéphaneChazelas
14年2月18日在16:58

@StephaneChazelas足以允许apt-get install --reinstall coreutils并使OP恢复正常。

– terdon♦
2014-02-18 17:02

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

–user55518
14年2月18日在22:06

您也可以用mv模拟rm(到“垃圾箱”)

–sendmoreinfo
2014年9月5日20:15在

#4 楼

我会尝试从另一台机器上获取正确的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


如果您没有另一台使用dpkg的计算机,则可以使用ar提取文件(从binutils开发工具)和tar:

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm


评论


如果scp不可用,则发送方的nc(也称为netcat)以及接收方的带有/ dev / tcp / HOST / PORT重定向的bash也可能有效。

– MvG
14年2月19日在19:06

#5 楼

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