Получить IP-адреса всех устройств, подключенных к локальной сети (на основе имени хоста) с помощью Python - PullRequest
0 голосов
/ 25 августа 2018

это определенно не дубликат.

Я делаю приложение, и мне нужно найти IP-адреса моих устройств. Я знаю их имя, и через их имя мне нужно получить их IP. Linux должен быть простым, но мне нужно межплатформенное отношение, поэтому я использую python.

Я уже знаю решение:

import socket
socket.gethostbyname('pc_name')

Если я знаю решение, почему я спрашиваю? Хорошо, дай мне минутку, потому что я не получаю стабильных результатов.

Положение: Мне нужно найти IP-адреса нескольких Raspberry Pi с одинаковым именем хоста - скажем:

Raspberry pi device 1: Hostname: 'MyPi', Local IP: 10.0.0.33

Raspberry pi device 2: Hostname: 'MyPi', Local IP: 10.0.0.34

Raspberry pi device 3: Hostname: 'MyPi', Local IP: 10.0.0.35

Итак, согласно документации на сокет (если я правильно прочитал),

socket.gethostbyname('MyPi') 

возвращает только один IP, ОДНАКО

socket.gethostbyname_ex('MyPi') 

должен вернуть все IP-адреса для определенного имени хоста.

Я смоделировал ситуацию дома, и результаты были очень неудовлетворительными. Я назвал свой Raspberry Pi своим телефоном на Android: «Galaxy-J5-2016». Чтобы убедиться, что я пытался найти их по адресу:

>>> socket.gethostbyaddr('10.0.0.33')
('Galaxy-J5-2016', [], ['10.0.0.33'])
>>> socket.gethostbyaddr('10.0.0.34')
('Galaxy-J5-2016', [], ['10.0.0.34'])

Хорошо, они существуют. Когда я проверял это перед написанием здесь, я даже получил один результат, если я искал

socket.gethostbyname('Galaxy-J5-2016')

НО сейчас я ничего не нахожу, даже если попробую

socket.gethostbyname_ex('Galaxy-J5-2016')

Обе приведенные выше команды просто ждут без ответа, а затем отвечают следующим образом:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
socket.gaierror: [Errno 11001] getaddrinfo failed

Произошло еще одно явление: когда я пытаюсь в последний раз упомянуть команду на своем рабочем ноутбуке (хотя мой рабочий компьютер не разделяет имя хоста с любым другим компьютером),

>>> socket.gethostbyname_ex('WORK_PC.DOM1.DOM2')
('WORK_PC.DOM1.DOM2', [], ['172.xx.xx.1', '10.0.xx.1', '172.xx.xx.241', 
 '192.xx.xx.1', '192.xx.xx.1', **'10.0.0.41'**])

Интересно, 10.0.0.41 - это локальный IP-адрес, который мой РАБОЧИЙ ПК имеет прямо сейчас дома (остальное, кажется, из сети на моей работе).

Другими словами: У меня есть две машины с одинаковым именем хоста, и я получаю ноль или только один IP-адрес, и мой рабочий компьютер - это всего лишь одна МАШИНА, и я получаю несколько IP-адресов одной машины, и эти IP-адреса так сказать, даже не из фактической локальной сети)

PS (на случай, если вы посоветуете мне 'arp -a'): общая команда 'arp -a' бесполезна, поскольку показывает все локальные IP-адреса, которые недавно были в контакте с командной машиной. Поэтому мне нужно пропинговать конкретные устройства, чтобы увидеть их в списке arp -a.

PS2: Также я не хочу никакого решения, которое требует прохождения всех IP-адресов. Это решение очень медленное, так как пропинг IP, который не существует, приведет к задержке в несколько секунд. 255 IP + тайм-аут не хорош.

Честно говоря, если существует команда python для немедленного вывода списка всех устройств, подключенных к локальной сети, этого достаточно ... Но я не нашел ничего подобного.

Я что-то не так делаю? Вы можете направить меня?

Заранее спасибо

...