诊断 Linux 上的目录删除

诊断 Linux 上的目录删除

昨天晚上我丢失了我的所有项目,或者更确切地说,f/我主目录中的目录树。

我从备份中恢复。

几分钟前它又消失了(对我来说幸运的是,从那时起我开始在每次重建时进行备份,并且我经常重建,所以这次没有损失)。我不知道我可以运行或自己编写的任何可执行文件可以做到这一点。

由于该问题似乎与有关有关~/f/,我认为这是一个有缺陷的脚本,它想做rm -rf但却做了rm -r f

我怎样才能找到罪魁祸首?

答案1

假设 rm确实涉及并且它是/bin/rm

  1. sudo ln /bin/rm /bin/rm-real
  2. 创建任何人都可写入的日志目录:

    mkdir /tmp/rm-logdir
    chmod a+w /tmp/rm-logdir
    
  3. 编写一个包装脚本(名为script),如下所示:

    #!/bin/sh
    pstree -spa "$$" >> "/tmp/rm-logdir/$$"
    exec /bin/rm-real "$@"
    
  4. 调整脚本的所有权和权限,以便它可以模仿rm(非 POSIX 快速方法chmod --reference=/bin/rm script; sudo chown --reference=/bin/rm script:)。

  5. /bin/rm用脚本替换:

    sudo mv script /bin/rm
    

    从现在开始,任何呼叫/bin/rm都将被记录到文件中/tmp/rm-logdir

  6. 等待问题再次出现。

  7. 检查中的文件/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在本例中)使用了包装脚本。

笔记:

  • pstreePOSIX 不要求,它可能不可用。您可以使用ps,也可以直接从 读取信息/proc
  • 在多用户环境中,该解决方案并不安全。任何人都可以写入日志目录。这是故意设置的,目的是以rm一种懒惰、快速和肮脏的方式捕获任何人的调用。但任何人都可以伪造结果。

恢复方法:

sudo mv /bin/rm-real /bin/rm

(请注意,这将覆盖脚本,因此如果没有其他副本,脚本本身将会丢失)。

相关内容