Comment puis-je obtenir facilement une liste des adresses IP ou des noms d'hôte d'un réseau local en Python?
Il serait préférable qu'il soit multi-plateforme, mais il doit d'abord fonctionner sur Mac OS X, puis d'autres suivent.
Modifier: Par local, je veux dire toutes les adresses actives au sein d'un réseau local, telles que 192.168.xxx.xxx
.
Donc, si l'adresse IP de mon ordinateur (au sein du réseau local) est 192.168.1.1
, et j'ai trois autres ordinateurs connectés, je voudrais qu'il renvoie les adresses IP 192.168.1.2
, 192.168.1.3
, 192.168.1.4
, et éventuellement leurs noms d'hôtes.
Si par "local" vous voulez dire sur le même segment de réseau, vous devez effectuer les étapes suivantes:
Ou vous pouvez simplement laisser Python exécuter nmap en externe et rediriger les résultats dans votre programme.
Mise à jour : Le script est maintenant situé sur github .
J'ai écrit un petit python , qui tire parti de la arping()
de scapy ).
Si vous connaissez les noms de vos ordinateurs, vous pouvez utiliser:
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
Sinon, vous devrez rechercher toutes les adresses IP qui suivent le même masque que votre ordinateur local (IP1), comme indiqué dans une autre réponse.
J'ai collecté les fonctionnalités suivantes à partir d'autres threads et cela fonctionne pour moi dans 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 __== '__main__':
print('Mapping...')
lst = map_network()
print(lst)
Essayer:
import socket
print ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
J'ai trouvé ceci scanner réseau dans python et j'ai écrit ce code court. Il fait ce que vous voulez! Vous devez cependant connaître les ports accessibles pour vos appareils. Port 22 est la norme ssh et ce que j'utilise. Je suppose que vous pouvez faire une boucle sur tous les ports. Certaines valeurs par défaut sont:
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))