在最近的漏洞披露之后搜索系统解析的服务时,我发现 find 命令的行为非常奇怪。
root@localhost:/# find . -name "*systemd-resolved*"
./usr/share/man/man8/systemd-resolved.service.8.gz
./usr/share/man/man8/systemd-resolved.8.gz
该命令第一次运行时返回 0 或两行输出。但如果我第二次运行该命令,我得到:
root@localhost:/# find . -name "*systemd-resolved*"
./usr/share/man/man8/systemd-resolved.service.8.gz
./usr/share/man/man8/systemd-resolved.8.gz
./lib/systemd/systemd-resolved
./lib/systemd/system/systemd-resolved.service.d
./lib/systemd/system/systemd-resolved.service
这意味着第一次“find”实际上并没有找到所有内容。而且这种情况只发生一次。下次运行该命令时会显示正确的输出。我在安装了 Debian 8(jessie)的其他一些系统上检查了这一点。在内核为 4.9+ 的系统上,总是会出现同样的问题,但在内核为 3.16 的系统上不会发生这种情况。
系统重启后,所有这些都会再次发生。但每个系统的行为都是相同的。这意味着,如果在特定系统上进行测试,第一次运行时(错误地)返回两行输出,第二次运行时返回正确的输出,那么在系统重启后,第一次运行该命令时会再次打印两行。因此,系统在每次重启后都会显示相同的行为(根据我的测试)。文件详细信息如下:
-rw-r--r-- 1 root root ./usr/share/man/man8/systemd-resolved.service.8.gz
lrwxrwxrwx 1 root root ./usr/share/man/man8/systemd-resolved.8.gz -> systemd-resolved.service.8.gz
-rwxr-xr-x 1 root root ./lib/systemd/systemd-resolved
drwxr-xr-x 2 root root ./lib/systemd/system/systemd-resolved.service.d
-rw-r--r-- 1 root root ./lib/systemd/system/systemd-resolved.service
编辑:对于所有提出该问题的人,可能与这些特定文件的特定情况有关:“系统解析“只是举个例子。搜索其他关键词时也会发生这种情况。这是另一个第一次运行就给出错误结果的例子:
root@localhost:/# find . -name "*apache*"
这里没有人能够在具有来自反向移植存储库的最新内核的 Debian 8 上检查这个问题吗?
答案1
Debian 8 上安装的 findutils 默认版本是 4.4.2,这是 jessie 存储库中的最新版本。我下载了 findutils 源代码的最新版本 (4.6.0),并从源代码构建了二进制文件。然后我进行了相同的测试,“find”命令显示正确的第一次运行的输出。
然后我下载了 findutils 版本4.4.2从 gnu 档案中获取源代码并进行编译。编译后的 find 命令也出现了同样的问题。因此,这个问题不会发生在 findutils 4.6.0 中。
但我仍然不知道为什么有些用户使用 findutils 4.4.2(Debian 上安装的默认版本)没有得到相同的结果,也不知道为什么 Debian 仍然发布这个旧版本的 findutils 和可能的其他 Linux 实用程序并导致这种有问题的情况。最后一件事是,奇怪的事情发生的确切技术原因仍然未知,这是不可取的。因为我不确定我的操作系统环境中是否存在令人担忧的东西。