Обнаружение имени хоста для всех машин в сети

Проблема: я разрабатываю графический интерфейс для симулятора распределенного процессора / графического процессора. Поскольку в этом симуляторе используется MPI, для него требуется файл хоста с подробным описанием имен хостов для всех компьютеров, используемых в сети, чтобы он знал, какие машины должны распределяться между ними. Поскольку конечные пользователи моего приложения не являются специалистами по компьютерам (и, возможно, даже не очень хорошо разбираются в компьютерах), я не могу ожидать, что они будут знать / находить имена узлов каждого компьютера в своей сети / кластере. Я хотел бы программно выполнить это обнаружение имени хоста, чтобы при запуске приложения пользователь мог видеть доступные машины, и из них выбирать хосты, на которых они хотят работать. Если возможно, я бы хотел, чтобы это решение было кроссплатформенным, но так как симулятор в настоящее время содержит некоторые зависимости от Linux, я могу работать только с Linux.

Что я пробовал до сих пор: я пытался использовать пакет nmap для обнаружения хостов в сети с помощью таких команд, как nmap -sP <ip address range> используя диапазон IP-адресов для этой локальной сети. Тем не менее, он только сбрасывает IP-адреса для хостов (не имена хостов), и я не уверен, как преобразовать эти IP-адреса в имена хостов ssh (поскольку MPI использует ssh для обнаружения хостов). Кроме того, я использовал аналогичный подход с ping, предоставляя широковещательный адрес, и он дал почти идентичные результаты.

Я прошу прощения за широкую природу этого вопроса и отсутствие показанного кода, но я не очень опытен в изучении / программировании сети, и я действительно даже не уверен, с чего начать. Я попытался погуглить это, но я не смог найти подходящий вариант (возможно, из-за недостатка опыта я использовал неправильную терминологию, приводящую к неправильным результатам). Мой опыт в основном связан с графикой и программированием пользовательского интерфейса, так что это немного за пределами моей зоны комфорта.,

1 ответ

Решение

SSH не заботится, даны ли ему имена хостов или IP-адреса для подключения (не уверен, применимо ли это, когда есть специфичные для хоста конфигурации). Большинство реализаций MPI тоже не заботятся, например, в Open MPI-соединениях все адреса URI являются числовыми, поэтому файл с IP-адресами будет в порядке. С другой стороны, HTTP-серверы заботятся о виртуальном хостинге, когда многие разные сайты разрешают один и тот же IP-адрес, но серверу предоставляется фактическое имя хоста через Host HTTP заголовок.

Незатребованный совет: поиск хостов с помощью 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.

Другие вопросы по тегам