sudo rm -f /bin/rm
我以为我可以重新安装
coreutils
:我错了!apt-get install --reinstall coreutils
提供了来自dpkg
的错误,表示无法删除该软件包。无法从源代码进行编译,因为Makefile
使用了rm
。如何才能恢复正常的
rm
?#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
模块提供了一些附加的内置命令(ln
,mkdir
,rmdir
,chown
,chmod
,sync
,zsh
,ksh93
)。在这种情况下,或者当您不能派生更多进程但确实要运行交互式rm
时,它很有用。basename
还具有许多额外的/可选的命令buitin,但其中没有chmod
(dirname
, getconf
,head
,mkdir
,logname
,cat
,cmp
,cut
,uname
,wc
,sync
,ksh93
,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-get
或dpkg
需要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软件包,即使您破坏了其他所有内容,该软件包也可以使用。
评论
每个.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个人发现此问题很有趣。