如何神奇地从 Ubuntu Server 中删除“bin、lib、lib64 和 sbin”文件夹?

如何神奇地从 Ubuntu Server 中删除“bin、lib、lib64 和 sbin”文件夹?

有一天,我尝试重新启动我的 Ubuntu 20 服务器,但它在启动时始终失败,并出现“内核恐慌”。使用我们的服务提供商提供的“救援模式”进行调查后,我们发现根目录中没有任何文件夹:

  • 垃圾桶
  • 库64
  • 斯宾

我们修复了它,创建了 /usr/xxx 等价物的符号链接,并且顺利启动

此时此刻,我不知道这是怎么发生的。

  1. 是否存在任何已知的漏洞或利用这些症状?
  2. 我应该检查什么才能进一步了解根本原因?

- 编辑 -

我已经按照答案中的建议以 root 身份检查了历史记录,但我看不到与涉及“神奇消失”的文件夹的“rm -rf *”(或类似内容)相关的任何内容。我得到的输出:

历史| grep rm

  887  rm 09
  888  rm _new*
  891  rm _new*
  893  rm _new*
  916  rm _new_*
  918  rm _new_*
  922  rm _new_*
  927  rm _*
  934  rm _*
  936  rm _*
  974  rm woo*
  975  rm -r woocommerce_uploads/
  980  rm -r test/
 1024  rm -r directory-files-converter_MODIFIED/
 1165  history | grep rm

历史| grep bin

  502  joe /usr/local/bin/copias
  516  joe /usr/local/bin/copias
  518  joe /usr/local/bin/copias
  520  joe /usr/local/bin/copias
  575  cd /usr/local/bin/
  609  cd /usr/local/bin/dreport
  610  cd /usr/local/bin/dcheck/
  760  cat /usr/local/bin/copias
  764  /usr/local/bin/dreport
 1166  history | grep bin

还有其他想法去哪里看吗?

答案1

rm /*以 root 权限执行的某人或某事。检查history(以 root 身份)。

或者,我已经看到足够多的写得不好的脚本,其中包含这种形式的代码:

rm $someVar/*

期望$someVar永远不为空,不包含$IFS或通配符的字符,也不以 开头-。然而,可以触发您的场景的是,它$someVar是空的,其中变量被扩展并且命令变成这样:

rm /*

或者$someVar以恰好出现在$IFS(默认情况下为空格、制表符、换行符)的字符结尾,例如someVar='dir '在这种情况下命令将变为:

rm dir /*

代码可以写得更好,rm -- "$someVar"/*这可以解决后一个问题,但这仍然无法应对$someVar空的情况。两种选择可能是:

[ -n "$someVar" ] && rm -f -- "$someVar"/*    # Execute only if set

rm -f -- "${someVar:?is undefined}"/*         # Abort with error if unset or empty

设置nounset选项(set -o nounsetset -u)会导致 shell 进程在取消引用未设置的变量时中止,也有助于检测变量名称中可能导致此类问题的拼写错误。

相关内容