networking socket - Elenco di indirizzi IP / nomi host dalla rete locale in Python




server tcp (7)

Come posso ottenere facilmente in Python un elenco di indirizzi IP o nomi di host da una rete locale?

Sarebbe meglio se fosse multipiattaforma, ma prima deve lavorare su Mac OS X, poi seguire altri.

Modifica: per locale intendo tutti gli indirizzi attivi all'interno di una rete locale, ad esempio 192.168.xxx.xxx .

Quindi, se l'indirizzo IP del mio computer (all'interno della rete locale) è 192.168.1.1 , e ho altri tre computer collegati, vorrei che restituisse gli indirizzi IP 192.168.1.2 , 192.168.1.3 , 192.168.1.4 , e forse i loro nomi di host.


Answers

Ho raccolto le seguenti funzionalità da alcuni altri thread e funziona per me in 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)

Se conosci i nomi dei tuoi computer puoi usare:

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

Altrimenti dovrai cercare tutti gli indirizzi IP che seguono la stessa maschera del tuo computer locale (IP1), come indicato in un'altra risposta.



Ecco un piccolo strumento scanip che ti aiuterà a ottenere tutti gli indirizzi IP ei loro indirizzi mac corrispondenti nella rete (Works on Linux). Questo è il link per scanip (scanner Ip e Mac) scritto in python. https://pypi.python.org/pypi/scanip/1.0

Puoi anche scaricarlo usando pip install scanip su linux e usarlo, creare un file di test in python e usarlo come questo-

import scanip.scanip

scanip.scanip.start_scan()

ed esegui questo programma. Tutti gli indirizzi IP e i corrispondenti indirizzi MAC nella LAN verranno visualizzati nel terminale.


Se per "locale" intendi nello stesso segmento di rete, devi eseguire i seguenti passaggi:

  1. Determina il tuo indirizzo IP
  2. Determina la tua maschera di rete
  3. Determina l'intervallo di rete
  4. Scansiona tutti gli indirizzi (tranne il più basso, che è il tuo indirizzo di rete e il più alto, che è il tuo indirizzo di broadcast).
  5. Utilizzare la ricerca inversa del DNS per determinare il nome host per gli indirizzi IP che rispondono alla scansione.

Oppure puoi semplicemente lasciare Python eseguire nmap esternamente e reindirizzare i risultati nel tuo programma.


Una delle risposte in questa domanda potrebbe aiutarti. Sembra esserci una versione agnostica della piattaforma per Python, ma non l'ho ancora provata.


- in "-". join (my_list) dichiara che stai convertendo in una stringa da unire elementi a un elenco. È orientato ai risultati. (solo per memoria e comprensione facili)

Faccio un esaustivo cheatsheet di methods_of_string come riferimento.

string_methonds_44 = {
    'convert': ['join','split', 'rsplit','splitlines', 'partition', 'rpartition'],
    'edit': ['replace', 'lstrip', 'rstrip', 'strip'],
    'search': ['endswith', 'startswith', 'count', 'index', 'find','rindex', 'rfind',],
    'condition': ['isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isnumeric','isidentifier',
                  'islower','istitle', 'isupper','isprintable', 'isspace', ],
    'text': ['lower', 'upper', 'capitalize', 'title', 'swapcase',
             'center', 'ljust', 'rjust', 'zfill', 'expandtabs','casefold'],
    'encode': ['translate', 'maketrans', 'encode'],
    'format': ['format', 'format_map']}




python networking