5

问题:我正在为分布式 CPU/GPU 模拟器开发图形前端。由于此模拟器使用 MPI,它需要一个主机文件,详细说明网络上使用的所有计算机的主机名,以便它知道要在哪些机器上分发。由于我的应用程序的最终用户不是计算机科学家(甚至可能不是很懂计算机),我不能指望他们知道/找到他们网络/集群上每台计算机的主机名。我想以编程方式执行此主机名发现,以便在应用程序启动时,用户可以看到可用的机器,并从中选择他们想要运行的主机。如果可能的话,我希望这个解决方案是跨平台的,但由于模拟器当前包含一些 linux 依赖项,我可以处理仅 Linux 的解决方案。

到目前为止我所尝试的:我尝试使用 nmap 包来发现网络上的主机,其命令包括nmap -sP <ip address range>使用该本地网络的 ip 地址范围。但是,它只转储主机的 IP 地址(而不是主机名),我不确定如何将这些 IP 地址转换为 ssh 主机名(因为 MPI 使用 ssh 进行主机发现)。此外,我使用了类似的方法,通过 ping 提供广播地址,它返回几乎相同的结果。

我为这个问题的广泛性和缺乏显示的代码道歉,但我对网络探测/编程不是很有经验,我什至不知道从哪里开始。我尝试用谷歌搜索,但找不到合适的选项(可能是因为我缺乏经验导致我使用不正确的术语导致不正确的结果)我的背景主要是图形和用户界面编程,所以这有点超出我的舒适区.

4

1 回答 1

5

SSH 不关心它是否有主机名或 IP 地址来连接(不确定这是否适用于特定于主机的配置)。大多数 MPI 实现也不在乎,例如在 Open MPI 连接中,URI 地址都是数字的,所以带有 IP 的主机文件就可以了。另一方面,HTTP 服务器很关心虚拟主机,其中许多不同的站点解析到相同的 IP 地址,但通过HostHTTP 标头为服务器提供了实际的主机名。

不请自来的建议:通过 ping 查找主机很好,但不能保证您找到了运行 SSH 的机器。您最好扫描打开端口 22 并接受 TCP 连接的系统:

$ 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 客户端的权限被拒绝错误和非零退出代码。

于 2013-04-01T09:25:54.743 回答