Список IP-адресов / имен хостов из локальной сети в Python - PullRequest
35 голосов
/ 16 октября 2008

Как я могу легко получить список 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 и, возможно, их имена хостов.

Ответы [ 7 ]

20 голосов
/ 02 марта 2009

Обновление : скрипт теперь находится на github .

Я написал маленький скрипт на питоне , который использует scapy '* arping().

18 голосов
/ 16 октября 2008

Если под «локальным» вы подразумеваете один и тот же сегмент сети, то вам необходимо выполнить следующие шаги:

  1. Определите свой собственный IP-адрес
  2. Определите свою собственную маску
  3. Определить диапазон сети
  4. Сканирование всех адресов (кроме самого низкого, который является вашим сетевым адресом, и самого высокого, который является вашим широковещательным адресом).
  5. Используйте обратный поиск DNS для определения имени хоста для IP-адресов, которые отвечают на ваше сканирование.

Или вы можете просто позволить Python внешне выполнить nmap и передать результаты обратно в вашу программу.

9 голосов
/ 16 октября 2008

Если вы знаете имена своих компьютеров, вы можете использовать:

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), как указано в другом ответе.

3 голосов
/ 04 февраля 2018

Я собрал следующую функциональность из некоторых других потоков, и она работает для меня в 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)
3 голосов
/ 19 августа 2012

Попробуйте:

import socket

print ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
0 голосов
/ 24 апреля 2016

Вот небольшой инструмент scanip , который поможет вам получить все ip-адреса и их соответствующие mac-адреса в сети (работает на 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-адреса в локальной сети будут отображаться в терминале.

0 голосов
/ 16 октября 2008

Один из ответов в этот вопрос может помочь вам. Кажется, есть версия, независимая от платформы для python, но я еще не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...