Список IP-адресов/имен хостов из локальной сети в Python
Как я могу получить список IP-адресов или имен узлов из локальной сети в Python?
Было бы лучше, если бы это было многоплатформенное, но сначала нужно сначала работать с Mac OS X, затем следовать другим.
Изменить: По локальному я имею в виду все активные адреса в локальной сети, такие как 192.168.xxx.xxx
.
Итак, если IP-адрес моего компьютера (внутри локальной сети) равен 192.168.1.1
, и у меня есть три других подключенных компьютера, я бы хотел, чтобы он возвращал IP-адреса 192.168.1.2
, 192.168.1.3
, 192.168.1.4
и, возможно, их имена хостов.
Ответы
Ответ 1
Если по "локальному" вы имеете в виду один и тот же сегмент сети, вам необходимо выполнить следующие шаги:
- Определите свой собственный IP-адрес.
- Определите свою собственную сетевую маску.
- Определите диапазон сети
- Сканировать все адреса (кроме самого низкого, который является вашим сетевым адресом и самым высоким, который является вашим широковещательным адресом).
- Используйте обратный поиск DNS для определения имени хоста для IP-адресов, которые отвечают на ваше сканирование.
Или вы можете просто позволить Python выполнить nmap извне и передать результаты обратно в вашу программу.
Ответ 2
Обновить. script теперь находится на github.
Я написал маленький python script, который использует scapy arping()
.
Ответ 3
Если вы знаете имена своих компьютеров, вы можете использовать:
import socket
IP1 = socket.gethostbyname(socket.gethostname()) # local IP adress of your computer
IP2 = socket.gethostbyname('name_of_your_computer') # IP adress of remote computer
В противном случае вам придется сканировать все IP-адреса, которые следуют за той же маской, что и ваш локальный компьютер (IP1), как указано в другом ответе.
Ответ 4
Пытаться:
import socket
print ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
Ответ 5
Я собрал следующую функциональность из некоторых других потоков, и она работает для меня в Ubuntu.
import os
import socket
import multiprocessing
import subprocess
import os
def pinger(job_q, results_q):
"""
Do Ping
:param job_q:
:param results_q:
:return:
"""
DEVNULL = open(os.devnull, 'w')
while True:
ip = job_q.get()
if ip is None:
break
try:
subprocess.check_call(['ping', '-c1', ip],
stdout=DEVNULL)
results_q.put(ip)
except:
pass
def get_my_ip():
"""
Find my IP address
:return:
"""
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
def map_network(pool_size=255):
"""
Maps the network
:param pool_size: amount of parallel ping processes
:return: list of valid ip addresses
"""
ip_list = list()
# get my IP and compose a base like 192.168.1.xxx
ip_parts = get_my_ip().split('.')
base_ip = ip_parts[0] + '.' + ip_parts[1] + '.' + ip_parts[2] + '.'
# prepare the jobs queue
jobs = multiprocessing.Queue()
results = multiprocessing.Queue()
pool = [multiprocessing.Process(target=pinger, args=(jobs, results)) for i in range(pool_size)]
for p in pool:
p.start()
# cue hte ping processes
for i in range(1, 255):
jobs.put(base_ip + '{0}'.format(i))
for p in pool:
jobs.put(None)
for p in pool:
p.join()
# collect he results
while not results.empty():
ip = results.get()
ip_list.append(ip)
return ip_list
if __name__ == '__main__':
print('Mapping...')
lst = map_network()
print(lst)
Ответ 6
Один из ответов в этот вопрос может вам помочь. По-видимому, для python существует версия agnostic для платформы, но я еще не пробовал ее.
Ответ 7
Вот небольшой инструмент scanip, который поможет вам получить все IP-адреса и соответствующие им адреса mac в сети (Works on Linux).
Это ссылка на scanip (сканер Ip и Mac), написанный на python.
https://pypi.python.org/pypi/scanip/1.0
Вы также можете скачать его с помощью pip install scanip на linux и использовать его, создать тестовый файл на python и использовать его так:
import scanip.scanip
scanip.scanip.start_scan()
и запустите эту программу. Все ip и соответствующие им адреса mac в ЛВС будут показаны в терминале.
Ответ 8
Я нашел этот сетевой сканер в статье на Python и написал этот короткий код. Делай что хочешь! Однако вам необходимо знать доступные порты для ваших устройств. Порт 22 является стандартом SSH и что я использую. Я полагаю, вы можете перебрать все порты. Некоторые значения по умолчанию:
linux: [20, 21, 22, 23, 25, 80, 111, 443, 445, 631, 993, 995]
windows: [135, 137, 138, 139, 445]
mac: [22, 445, 548, 631]
import socket
def connect(hostname, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.setdefaulttimeout(1)
result = sock.connect_ex((hostname, port))
sock.close()
return result == 0
for i in range(0,255):
res = connect("192.168.1."+str(i), 22)
if res:
print("Device found at: ", "192.168.1."+str(i) + ":"+str(22))