我们正在实施一个 Web 前端来管理 NFS 和 CIFS 共享文件夹。其中一部分显示可从任意 IP 地址获取的可用共享点(导出)。
后端用于smbclient -L <ip> -U <user>
查询SMB/CIFS共享,用于showmount -e <ip>
查询NFS共享。
但是,showmount
如果目标服务器运行任何类型的防火墙(无论 Windows、Mac 或 Linux),则会挂起。 (这些 SE/SU 帖子这里和这里提到 NFS 有防火墙问题)
我们测试了现有和不存在机器的展示安装。测试以下几种组合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:端口的连接,如果成功,则运行showmount
。但还有其他办法吗?
后端运行在 Centos 8 上。
答案1
可以指示该timeout
命令使用该SIGKILL
信号(请参阅man timeout
)。这showmount
非常有效地适用于:
timeout --signal KILL 3s showmount -e remoteNFSServer