web-dev-qa-db-fra.com

Liste des adresses IP / noms d'hôte du réseau local dans Python

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.

36
Josh Hunt

Si par "local" vous voulez dire sur le même segment de réseau, vous devez effectuer les étapes suivantes:

  1. Déterminez votre propre adresse IP
  2. Déterminez votre propre masque de réseau
  3. Déterminer la portée du réseau
  4. Scannez toutes les adresses (sauf la plus basse, qui est votre adresse réseau et la plus élevée, qui est votre adresse de diffusion).
  5. Utilisez la recherche inversée de votre DNS pour déterminer le nom d'hôte des adresses IP qui répondent à votre analyse.

Ou vous pouvez simplement laisser Python exécuter nmap en externe et rediriger les résultats dans votre programme.

18
Steve Moyer

Mise à jour : Le script est maintenant situé sur github .

J'ai écrit un petit python , qui tire parti de la arping() de scapy ).

20

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.

10
Mapad

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)
5
Santi Peñate-Vera

Essayer:

import socket

print ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
3
user870774

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))
0
Grebtsew