有一天,我尝试重新启动我的 Ubuntu 20 服务器,但它在启动时始终失败,并出现“内核恐慌”。使用我们的服务提供商提供的“救援模式”进行调查后,我们发现根目录中没有任何文件夹:
- 垃圾桶
- 库
- 库64
- 斯宾
我们修复了它,创建了 /usr/xxx 等价物的符号链接,并且顺利启动
此时此刻,我不知道这是怎么发生的。
- 是否存在任何已知的漏洞或利用这些症状?
- 我应该检查什么才能进一步了解根本原因?
- 编辑 -
我已经按照答案中的建议以 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 nounset
或set -u
)会导致 shell 进程在取消引用未设置的变量时中止,也有助于检测变量名称中可能导致此类问题的拼写错误。