问题:我正在为分布式CPU / GPU模拟器开发图形前端.由于此模拟器使用MPI,因此需要一个主机文件,详细说明网络上使用的所有计算机的主机名,以便它知道要分配的计算机.由于我的应用程序的最终用户不是计算机科学家(甚至可能不是计算机知识),我不能指望他们知道/找到他们网络/集群上每台计算机的主机名.我想以编程方式执行此主机名发现,以便在应用程序启动时,用户可以看到可用的计算机,然后从中选择要运行的主机.如果可能的话,我希望这个解决方案是跨平台的,但由于模拟器目前包含一些Linux依赖项,我可以处理仅Linux的解决方案.
到目前为止我尝试过:我尝试使用nmap包来发现网络上的主机,其命令如nmap -sP< ip address range>使用该本地网络的IP地址范围.但是,它只转储主机的IP地址(而不是主机名),我不知道如何将这些IP地址转换为ssh主机名(因为MPI使用ssh进行主机发现).另外,我使用类似的方法,ping提供广播地址,它返回几乎相同的结果.
我为这个问题的广泛性和缺少的代码道歉,但我对网络探测/编程不是很有经验,我甚至不确定从哪里开始.我试过谷歌搜索,但我无法找到合适的选项(可能是因为我缺乏经验导致我使用不正确的术语触发不正确的结果)我的背景主要是图形和用户界面编程,所以这有点超出我的舒适区.
解决方法:
SSH不关心是否给出了要连接的主机名或IP地址(当有特定于主机的配置时,不确定是否适用).大多数MPI实现也不关心,例如在Open MPI连接中,URI地址都是数字,因此具有IP的主机文件可以正常使用.另一方面,HTTP服务器关心的是虚拟主机事件,其中许多不同站点解析为相同的IP地址,但服务器通过主机HTTP头提供实际主机名.
未经请求的建议:通过ping查找主机很好,但它并不能保证您找到了正在运行SSH的计算机.您最好扫描接受TCP连接的端口22打开的系统:
$nmap -oX -sT -p22 <ip range>
-oX生成可轻松解析的XML输出. -oG也是一种很好的自动解析扫描结果的格式.运行SSH也不一定意味着用户可以登录系统 – 例如,它可以是网络路由器或其他可远程管理的设备.还必须注意仅显示用户可以登录而不必提供密码的机器,例如,使用RSA / DSA公钥,否则启动MPI工作将是一项非常繁琐的任务.您可以使用以下内容测试找到的每个主机:
$ssh -2 -o "PreferredAuthentications=gssapi-with-mic,hostbased,publickey" \
<host> hostname
此命令基本上排除所有交互式身份验证方法.如果连接成功,它将输出远程计算机的主机名.否则,您将从SSH客户端获得权限被拒绝错误和非零退出代码.