在最近的漏洞披露之后搜索系统解析服务,我发现 find 命令出现了一个非常奇怪的行为。
root@localhost:/# find . -name "*systemd-resolved*"
./usr/share/man/man8/systemd-resolved.service.8.gz
./usr/share/man/man8/systemd-resolved.8.gz
Run Code Online (Sandbox Code Playgroud)
该命令返回 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
Run Code Online (Sandbox Code Playgroud)
这意味着第一次,“查找”实际上并没有找到所有内容。而且这只会发生一次。下次运行命令会显示正确的输出。我在其他一些安装了 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
Run Code Online (Sandbox Code Playgroud)
编辑:对于所有提出问题的人来说,这些问题可能与这些特定文件的特定案例有关:“系统已解决”只是一个例子。搜索其他关键字时也会发生这种情况。这是另一个示例,它在第一次运行时给出了错误的结果:
root@localhost:/# find . -name "*apache*"
Run Code Online (Sandbox Code Playgroud)
这里没有人能够在带有最新内核的 Debian 8 上从 backport 存储库检查这个问题吗?
Debian 8 上安装的 findutils 默认版本是 4.4.2,这是 jessie 存储库上的最新版本。我下载了最新版本(4.6.0)的 findutils 源代码并从源代码构建了二进制文件。然后我做了相同的测试,“find”命令在第一次运行时显示了正确的输出。
然后我从 gnu 存档下载了 findutils 版本4.4.2源代码并编译了它。编译后的 find 命令也出现同样的问题。所以 findutils 4.6.0 不会出现这个问题。
但我仍然不知道为什么有些用户使用 findutils 4.4.2(Debian 上安装的该实用程序的默认版本)没有得到相同的结果,并且不知道为什么 Debian 仍应该使用这个旧版本的 findutils 来发布以及可能的其他 Linux 实用程序并导致这种有问题的情况。最后一件事是,发生奇怪事件的确切技术原因仍然未知,这是不可取的。因为我不确定我的操作系统环境是否存在令人担忧的地方。