O comando find do Linux está se comportando mal

14

Procurando serviço resolvido pelo sistema após a recente divulgação de vulnerabilidades, vi um comportamento muito estranho do comando find.

 root@localhost:/# find . -name "*systemd-resolved*"
./usr/share/man/man8/systemd-resolved.service.8.gz
./usr/share/man/man8/systemd-resolved.8.gz

O comando retorna 0 ou duas linhas como saída para a primeira execução. Mas se eu executar o comando na segunda vez, recebo:

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

Isso significa que, pela primeira vez, "localizar" na verdade não encontra tudo. Além disso, isso acontece apenas uma vez. A execução do comando na próxima vez mostra a saída correta. Eu verifiquei isso em alguns outros sistemas com o Debian 8 (jessie) instalado. Nas pessoas com o Kernel 4.9+, esse problema exato sempre ocorre, mas nos sistemas com o kernel 3.16 isso não ocorre.
Após a reinicialização do sistema, tudo isso acontece novamente. Mas o comportamento é o mesmo para cada sistema individual. Isso significa que, se o teste em um sistema específico retornar (incorretamente) duas linhas de saída para a primeira execução e a saída correta para a segunda execução, a primeira execução do comando após a reinicialização do sistema imprimirá novamente duas linhas. Portanto, os sistemas mostram o mesmo comportamento após cada reinicialização (de acordo com meus testes). Os detalhes dos arquivos são os seguintes:

-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

EDIT: Para todos aqueles que sugerem o problema, talvez relacionados a este caso específico para esses arquivos específicos: " resolvido pelo sistema " é apenas um exemplo. Isso acontece ao pesquisar outras palavras-chave também. Este é outro exemplo que fornece resultados incorretos para a primeira execução:

root@localhost:/# find . -name "*apache*"

Ninguém aqui é capaz de verificar esse problema em um Debian 8 com o kernel mais recente do repositório de backport?

user2808671
fonte
2
Você pode tentar comparar traços das duas chamadas, por exemplo, usando strace? Em qual SO você observou o comportamento defeituoso? O que você quer dizer com "retorna 0 ou dois resultados como acima"? Zero ou duas linhas de saída ou código de saída 0 + duas linhas? Isso acontece novamente depois de iniciar um novo shell ou reiniciar? Pode ser relevante que a primeira chamada retorne apenas arquivos, enquanto a segunda retorna arquivos e diretórios.
L0b0
1
@ l0b0 Como eu disse, isso acontece no Debian com o Kernel 4.9 em vários sistemas. Não verifiquei outras distros. 0 ou 2 significa zero ou duas linhas de saída. Isso acontece após cada reinicialização. Sua última declaração não se aplica aqui. Ele tenta devolver tudo. Diretórios e arquivos.
user2808671
1
@ l0b0 Bem, não sei ao certo o que você está procurando, mas como você pode ver, mencionei o comando para que seja possível reproduzir o problema. Esse comando deve retornar todos os caminhos que contêm "systemd-resolved", mas não o fará. Existem cinco caminhos no total que satisfazem essa condição, mas o programa "find" retorna apenas dois deles ou um ou zero. O que importa aqui é que a ferramenta está produzindo resultados incorretos e perde alguns caminhos corretos. E como mencionei, verifiquei isso em outros sistemas com o Debian, aqueles com o kernel 4.9 têm esse problema. Isso pode ser algo sério além do espaço do usuário.
user2808671
2
@ MarkWagner Não. Enchi um relatório de erro na lista de discussão de gnu findutils e de backports do Debian. Isso me parece muito sério, pois a fonte desse problema pode afetar muitas outras coisas, embora eu não saiba se vocês concordam comigo. De qualquer forma, "find" é uma ferramenta muito popular e sua saída deve ser confiável.
user2808671
2
Como é /lib/systemdmontado? Que tipo de sistema de arquivos é esse? Se for um ponto de montagem separado, a que horas foi montado?
Andrew Henle

Respostas:

4

A versão padrão do findutils que está instalada no Debian 8 é 4.4.2 e esta é a versão mais recente nos repositórios jessie. Eu baixo a versão mais recente (4.6.0) do código fonte findutils e construí os binários a partir da fonte. Então eu fiz os mesmos testes e o comando "find" mostrou a saída correta para a primeira execução.

Então baixei o código fonte do findutils versão 4.4.2 do arquivo gnu e o compilei. O mesmo problema aconteceu para o comando find compilado. Portanto, este problema não está acontecendo com o findutils 4.6.0.

Mas ainda não sei por que alguns usuários não obtêm os mesmos resultados usando o findutils 4.4.2 (a versão padrão do utilitário instalado no Debian) e não sei por que o Debian ainda deve ser lançado com esta versão antiga do findutils e possivelmente outros utilitários Linux e causam essa situação problemática. E a última coisa é que a razão técnica exata do que aconteceu estranhamente ainda é desconhecida, o que não é desejável. Porque não tenho certeza se há algo preocupante no meu ambiente de sistema operacional.

user2808671
fonte