Estamos implementando um front-end web para gerenciar pastas compartilhadas NFS e CIFS. Uma parte exibe os pontos de compartilhamento (exportações) disponíveis a partir de qualquer endereço IP arbitrário.
O back-end usa smbclient -L <ip> -U <user>
para consultar compartilhamentos SMB/CIFS e para showmount -e <ip>
consultar compartilhamentos NFS.
No entanto, showmount
trava se o servidor de destino estiver executando qualquer tipo de firewall (não importa Windows, Mac ou Linux). (Essas postagens SE/SU aqui e aqui mencionam que o NFS tem problemas com firewalls)
Testamos o show mount em máquinas existentes e inexistentes. Testando várias combinações de showmount -e <ip>
:
Machine NFSD Firewall Result
Exists Stopped Off clnt_create: RPC: Unable to receive
Exists Stopped On HANGS
Exists Running On HANGS
Exists Running Off returns list of exports
None n/a n/a clnt_create: RPC: Unable to receive
Quando showmount
travado, ele só pode ser morto por SIGKILL
(-9). Tentamos timeout
desistir após um período de tempo, mas também travou.
Executar strace
de outro terminal mostra que ele fica presoconnect
$ strace -p 63552
strace: Process 63552 attached
connect(4, {sa_family=AF_INET, sin_port=htons(111), sin_addr=inet_addr("192.168.2.10")}, 16
Pergunta Neste cenário, como podemos usar showmount
sem travar?
Uma ideia é escrever um programa para primeiro tentar abrir uma conexão com a porta NFS IP:port e, se tiver sucesso, então executar showmount
. Mas existe alguma outra maneira?
Back-end rodando no Centos 8.
O
timeout
comando pode ser instruído para usar oSIGKILL
sinal (verman timeout
). Isso funciona de formashowmount
bastante eficaz: