Список 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 и, возможно, их имена хостов.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
43
0
109 016
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

Нет, мне не нужен мой IP-адрес, мне нужны все остальные. То, что сказал Стив Мойер, но с кодом :)

Josh Hunt 16.10.2008 14:08
Ответ принят как подходящий

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

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

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

arp -a ??? # дополнительное место для распознавания комментария

Vishnoo Rath 21.12.2020 09:48

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

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

как мне узнать имя моего компьютера

Irfan Ghaffar7 14.02.2015 00:12

socket.gethostname () возвращает имя компьютера

Mapad 18.02.2015 21:03

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

Я написал небольшой скрипт python, который использует arping()чешуйчатый.

Пытаться:

import socket

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

Вот небольшой инструмент сканировать, который поможет вам получить все IP-адреса и соответствующие им MAC-адреса в сети (работает в Linux).

https://github.com/vivkv/scanip

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

В pinger() для какой строки написано DEVNULL = open(os.devnull, 'w')? И не следует ли закрывать os.devnull в конце функции, чтобы предотвратить утечку памяти?

ds_secret 14.08.2019 20:50

devnull - это консоль для перенаправления stdout и вывода на него, как если бы это был файл

Santi Peñate-Vera 16.08.2019 11:21

Mapping ... [] # Это результат, который я получил. Получаю только коробку. Есть ли этому повод?

Redgar Tech 17.07.2020 07:11

ты на Linux? В прошлый раз, когда я проверял, это не работает должным образом в Windows

Santi Peñate-Vera 17.07.2020 19:43

Я нашел этот сетевой сканер в статье на 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))

Я сделал следующий код, чтобы получить IP-адрес известного устройства MAC. Это можно изменить соответствующим образом, чтобы получить все IP-адреса с некоторыми манипуляциями со строками. Надеюсь, что это поможет вам.

#running windows cmd line  statement and put output into a string
cmd_out = os.popen("arp -a").read()
line_arr = cmd_out.split('\n')
line_count = len(line_arr)


#search in all lines for ip
for i in range(0, line_count):
    y = line_arr[i]
    z = y.find(mac_address)

    #if mac address is found then get the ip using regex matching
    if z > 0:
        ip_out= re.search('[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', y, re.M | re.I)

Для OSX (и Linux) простым решением является использование os.popen или os.system и выполнение команды arp -a.

Например:

devices = []
for device in os.popen('arp -a'): devices.append(device)

Это даст вам список устройств в вашей локальной сети.

Другие вопросы по теме