昨天晚上我丢失了我的所有项目,或者更确切地说,f/
我主目录中的目录树。
我从备份中恢复。
几分钟前它又消失了(对我来说幸运的是,从那时起我开始在每次重建时进行备份,并且我经常重建,所以这次没有损失)。我不知道我可以运行或自己编写的任何可执行文件可以做到这一点。
由于该问题似乎与有关有关~/f/
,我认为这是一个有缺陷的脚本,它想做rm -rf
但却做了rm -r f
。
我怎样才能找到罪魁祸首?
答案1
假设 rm
确实涉及并且它是/bin/rm
:
sudo ln /bin/rm /bin/rm-real
创建任何人都可写入的日志目录:
mkdir /tmp/rm-logdir chmod a+w /tmp/rm-logdir
编写一个包装脚本(名为
script
),如下所示:#!/bin/sh pstree -spa "$$" >> "/tmp/rm-logdir/$$" exec /bin/rm-real "$@"
调整脚本的所有权和权限,以便它可以模仿
rm
(非 POSIX 快速方法chmod --reference=/bin/rm script; sudo chown --reference=/bin/rm script
:)。/bin/rm
用脚本替换:sudo mv script /bin/rm
从现在开始,任何呼叫
/bin/rm
都将被记录到文件中/tmp/rm-logdir
。等待问题再次出现。
检查中的文件
/tmp/rm-logdir
。其中一个文件希望包含如下内容:systemd,1 `-tmux: server,2652 `-bash,8605 `-rm,15100 /bin/rm -r f `-pstree,15101 -spa 15100
使用命令行参数和 PID;请注意倒数第二行。上面实际上是我在 Kubuntu 中测试的一个例子,我
rm -r f
在交互式中运行bash
。另一个例子(不是我直接触发的)是:systemd,1 `-kdeinit5,1679 `-ksmserver,1700 `-rm,16400 /bin/rm /home/kamil/.config/session/kate_10d8d5de64000154299531000000017000020_1542995310_707537 `-pstree,16401 -spa 16400
这证明其他工具(
ksmserver
在本例中)使用了包装脚本。
笔记:
pstree
POSIX 不要求,它可能不可用。您可以使用ps
,也可以直接从 读取信息/proc
。- 在多用户环境中,该解决方案并不安全。任何人都可以写入日志目录。这是故意设置的,目的是以
rm
一种懒惰、快速和肮脏的方式捕获任何人的调用。但任何人都可以伪造结果。
恢复方法:
sudo mv /bin/rm-real /bin/rm
(请注意,这将覆盖脚本,因此如果没有其他副本,脚本本身将会丢失)。