我们正在实施一个 Web 前端来管理 NFS 和 CIFS 共享文件夹。其中一部分显示任意 IP 地址可用的共享点(导出)。
后端用于smbclient -L <ip> -U <user>
查询 SMB/CIFS 共享,并用于showmount -e <ip>
查询 NFS 共享。
但是,showmount
如果目标服务器运行任何类型的防火墙(无论是 Windows、Mac 还是 Linux),则挂起。(这些 SE/SU 帖子这里和这里提到 NFS 存在防火墙问题)
我们对现有和不存在的机器都测试了 show mount。测试了以下几种组合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
挂起时showmount
,只能通过SIGKILL
(-9) 来终止它。我们尝试使用timeout
经过一段时间后放弃但它也会挂起。
从另一个终端运行strace
显示它卡在connect
$ 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
问题在这种情况下,我们怎样才能使用showmount
而不挂起?
一个想法是编写一个程序,首先尝试打开与 NFS IP:port 的连接,如果成功,则运行showmount
。但是还有其他方法吗?
后端在 Centos 8 上运行。