• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Статья Сканер локальной сети для получения списка IP и MAC адресов на Python

На данный момент в различных операционных системах существует довольно много самых разнообразных сканеров сети, которые не только составят вам ее карту, но, также покажут, какие сетевые ресурсы доступны на каждой из найденных машин, их сетевые имена. Но, почему бы не сделать свой сканер на Python, который будет составлять карту сети, хоть и без сетевых ресурсов на данном этапе, но, тем не менее, работать он будет довольно быстро и в качестве практики очень даже полезно.

000.jpg


Что понадобится?

Для того, чтобы создать быстрый сканер сети, с возможностью его дальнейшего расширения, нам понадобиться установить scapy. Это многофункциональная библиотека, которая позволяет отправлять, анализировать и подделывать сетевые пакеты, а также сканировать или атаковать сети. Установка ее достаточно простая. Нужно написать в терминале команду:

pip install --pre scapy[basic]

Однако, это не единственный, но рекомендуемый, вариант установки данной библиотеки. Вот небольшая табличка с командами по установке разных по компоновке пакетов. Для наших целей будет вполне достаточно рекомендуемой установки.

screenshot1.png

Если ваша операционная система отличается от Linux, а в данном случае имеется в виду Windows, то потребуется установить библиотеку захвата пакетов Npcap. Если же вы используете Windows XP, хотя на сегодняшнее время это вряд ли, то нужно использовать библиотеку WinPcap. Установить Npcap можно скачав его .

На этом подготовительный этап можно завершить. Давайте теперь импортируем scapy в наш скрипт.

Python:
from platform import system
from socket import socket, AF_INET, SOCK_DGRAM
from subprocess import check_output
import os

import scapy.all as sc

Как видите, помимо библиотеки scapy для скрипта нужно будет импортировать еще несколько модулей входящих в состав стандартных библиотек python. В данном случае библиотека platform будет нужна для определения операционной системы. Так как данный скрипт будет работать как в Windows, так и в Linux. Библиотека socket используется для получения локального IP-адреса компьютера, а subprocess для выполнения команды и тем самым получения IP-адреса роутера, используемого в системе по умолчанию.


Получаем локальный IP-адрес

Давайте приступим к созданию сканера сети. Для начала нам будет нужна функция, которая получает локальный IP-адрес машины. Создадим ее и назовем, к примеру: local_ipv4(). Данная функция устанавливает соединение с адресом 10.255.255.255, а затем с помощью getsockname возвращает адрес и порт сокета. В данном случае порт нам не нужен, а вот адрес вполне пригодится. Поэтому забираем его из кортежа и возвращаем из функции. Если же произошла ошибка и соединение не удалось, возвращается адрес 127.0.0.1. Что, в принципе, будет соответствовать действительности, так как в данном случае сетевого соединения не будет, а будет использоваться только localhost.

Python:
def local_ipv4():
    st = socket(AF_INET, SOCK_DGRAM)
    try:
        st.connect(('10.255.255.255', 1))
        ip_l = st.getsockname()[0]
    except Exception:
        ip_l = '127.0.0.1'
    finally:
        st.close()
    return ip_l

Дополнение: функцию получения локального адреса можно сделать немного по другому, но только в том случае, если у вас ОС Linux. Нужно дополнительно установить библиотеки getmac и netifaces.

pip install getmac netifaces

В импорт добавить:

Python:
from getmac.getmac import _get_default_iface_linux
from netifaces import ifaddresses, AF_INET

Тогда функция будет выглядеть вот так:

Python:
def local_ipv4():
    try:
        return ifaddresses(_get_default_iface_linux()).setdefault(AF_INET)[0]['addr']
    except TypeError:
        return '127.0.0.1'


Получение IP-адреса шлюза используемого в системе по умолчанию

На следующем этапе нужно получить IP-адрес шлюза, который используется в системе по умолчанию. Для этого используем subprocess.check_output, которая запускает выполнение определенной команды в терминале и возвращает ее вывод. И для Linux, и для Windows будем использовать похожие команды. Для Linux это «route -n», а вот с Windows все чуточку посложнее, так как там при выполнении команды возвращается куча всяких не особо то нужных в данном случае параметров. Поэтому нужно будет выполнить среди всей этой информации поиск и вывести уже отфильтрованный результат.

Давайте сделаем первую функцию для Windows. Создадим get_gateway_win(). На вход она не получает никаких данных, а на выходе возвращает адрес шлюза. С помощью subprocess.check_output выполняется команда, после чего результат приводится к нужному виду и возвращается из функции.

Python:
def get_gateway_win():
    # получаем адрес шлюза по умолчанию для текущего сетевого интерфейса
    com = f'route PRINT 0* | findstr {local_ipv4()}'.split()
    return check_output(com, shell=True).decode('cp866').split()[2]

И для Linux, создадим функцию get_gateway_linx(). Принцип получения адреса шлюза здесь тот же самый и на выходе получается нужный адрес шлюза.

Python:
def get_gateway_linx():
    com = 'route -n'.split()
    ip_route = str(subprocess.check_output(com, shell=True)).split("\\n")[2].split()[1].strip()
    if ip_route.isdigit():
        return ip_route
    else:
        sock = socket.gethostbyname(ip_route)
        return sock


Сканирование сети

Теперь самое время приступить к сканированию сети. Создадим функцию get_ip_mac_nework(ip), которая на входе будет получать начальный адрес для сканирования с маской подсети, а возвращать список из словарей с полученными значениями ip и mac адресов. Сделаем с помощью функции scapy.srp широковещательный ARP запрос, чтобы получить ответы от всех компьютеров, которые находятся с нами в одной сети. Для отправки запроса нужно сформировать пакет, который будет состоять из широковещательного адреса и ARP-пакета, в котором указывается адрес и маска подсети. Параметр timeout указывает на то, что между запросами нужно делать паузу в одну секунду, а параметр verbose позволяет не выводить результаты выполнения запроса в терминал.

answered_list = sc.srp(sc.Ether(dst='ff:ff:ff:ff:ff:ff') / sc.ARP(pdst=ip), timeout=1, verbose=False)[0]

С помощью данного запроса мы можем получить два списка. С запросами, на которые был получен ответ и с запросами, на которые ответ не был получен. Так как нам не отвеченные запросы вроде бы без надобности, забираем только те, ответ на которые был получен. Потому, указываем явно, что забираем 0 элемент.

Далее в цикле пробежимся по содержимому списка с запросами и получим из него нужные значения, которые добавим в список, возвращаемый из функции в виде словаря.

Python:
def get_ip_mac_nework(ip):
    answered_list = sc.srp(sc.Ether(dst='ff:ff:ff:ff:ff:ff') / sc.ARP(pdst=ip), timeout=1, verbose=False)[0]
    clients_list = []
    for element in answered_list:
        clients_list.append({'ip': element[1].psrc, 'mac': element[1].hwsrc})
    return clients_list


Печать результатов сканирования

Ну и осталось вывести полученные результаты на экран. В данном случае за это будет отвечать функция print_ip_mac(mac_ip_list), которая на входе получает сформированный ранее список со словарями. Тут все просто. Пробегаемся в цикле по списку и получаем определенные значений из словарей под нужным индексом. После чего выводим на экран.

Код функции печати:

Python:
def print_ip_mac(mac_ip_list):
    print(f"\nMachine in Network:\n\nIP\t\t\t\t\tMAC-address\n{'-' * 41}")
    for client in mac_ip_list:
        print(f'{client["ip"]}\t\t{client["mac"]}')


Запуск сканирования сети

Для запуска сканирования сети, а также получения ip адресов будем использовать функцию main(). Для начала получим локальный ip, затем, в зависимости от системы ip шлюза. Сформируем из полученного локального IP-адреса адрес сети с маской и запустим функцию сканирования сети. После чего выведем на экран IP-адреса и результаты сканирования.

Код функции main():

Python:
def main():
    local_ip = local_ipv4()
    if system() == "Windows":
        gateway = get_gateway_win()
    elif system() == 'Linux':
        if not os.getuid() == 0:
            print('\n[+] Запустите скрипт с правами суперпользователя!\n')
            return
        gateway = get_gateway_linx()
    ip_mac_network = get_ip_mac_nework(f'{local_ip.split(".")[0]}.{local_ip.split(".")[1]}.{local_ip.split(".")[2]}.1/24')
    print(f'\n[+] Local IP: {local_ip}\n[+] Local Gateway: {gateway}')
    print_ip_mac(ip_mac_network)

А на этом, в данном случае все. Сканер сети готов, осталось только посмотреть на результаты его работы. Запускаем и видим, что в нашей локальной сети есть межсетевой экран. А те, кто понимает, даже узнали, что это pfSense, а также три машины ip и mac адреса которых были благополучно получены.

Результат работы сканера:

screenshot2.png


Python:
from platform import system
from socket import socket, AF_INET, SOCK_DGRAM, gethostbyname
from subprocess import check_output
import os

import scapy.all as sc


# получаем локальный IP-адрес
def local_ipv4():
    st = socket(AF_INET, SOCK_DGRAM)
    try:
        st.connect(('10.255.255.255', 1))
        ip_l = st.getsockname()[0]
    except Exception:
        ip_l = '127.0.0.1'
    finally:
        st.close()
    return ip_l


def get_gateway_win():
    # получаем адрес шлюза по умолчанию для текущего сетевого интерфейса в Windows
    com = f'route PRINT 0* | findstr {local_ipv4()}'.split()
    return check_output(com, shell=True).decode('cp866').split()[2]


# получение ip адреса шлюза используемого по умолчанию в Linux
def get_gateway_linx():
    ip_route = str(check_output('route -n | grep UG', shell=True).decode()).split()[1].strip()
    return ip_route


# сканируем сеть, получаем ip и mac сетевых машин
def get_ip_mac_nework(ip):
    answered_list = sc.srp(sc.Ether(dst='ff:ff:ff:ff:ff:ff') / sc.ARP(pdst=ip), timeout=1, verbose=False)[0]
    clients_list = []
    for element in answered_list:
        clients_list.append({'ip': element[1].psrc, 'mac': element[1].hwsrc})
    return clients_list


# функция печати сканированных ip и mac
def print_ip_mac(mac_ip_list):
    print(f"\nMachine in Network:\n\nIP\t\t\t\t\tMAC-address\n{'-' * 41}")
    for client in mac_ip_list:
        print(f'{client["ip"]}\t\t{client["mac"]}')


def main():
    local_ip = local_ipv4()
    if system() == "Windows":
        gateway = get_gateway_win()
    elif system() == 'Linux':
        if not os.getuid() == 0:
            print('\n[+] Запустите скрипт с правами суперпользователя!\n')
            return
        gateway = get_gateway_linx()
    ip_mac_network = get_ip_mac_nework(f'{local_ip.split(".")[0]}.{local_ip.split(".")[1]}.{local_ip.split(".")[2]}.1/24')
    print(f'\n[+] Local IP: {local_ip}\n[+] Local Gateway: {gateway}')
    print_ip_mac(ip_mac_network)


if __name__ == "__main__":
    main()

Ну и да, не забывайте о том, что именно таким образом вам удастся просканировать только локальную сеть.

Спасибо за внимание. Надеюсь, что данная информация была кому-нибудь полезной
 

Вложения

  • network_scanner_lin_win.zip
    1,1 КБ · Просмотры: 440
Последнее редактирование модератором:

Trixxx

Grey Team
04.04.2020
196
153
BIT
20
есть вопросы к решению, которое описано выше.

поэтому и возник вопрос: разве нет такого в стандартных модулях языка? зачем городить забор и изобретать велосипед?
Так посмотрите стандартные модули языка, для чего они, если это возможно, вы найдете информацию. Чем не нравиться socket? И какой вопрос есть к решению?)
 
Последнее редактирование:

Архонт

Green Team
03.12.2019
20
7
BIT
12
Так посмотрите стандартные модели языка, для чего они, если это возможно, вы найдете информацию. Чем не нравиться socket?
вы вообще читали всю ветку? там написано, что не так в решении со стэк оферфлоу. я даже процитировал его в прошлом ответе. ведите себя немного адекватнее, не нужно наезжать. мы здесь общаемся и обсуждаем важную тему. я искал решения со стандартными модулями и не через пень колоду. читал документацию по нескольким вроде бы подходящим модулям, искал в поисковиках
 

Johan Van

Green Team
13.06.2020
350
656
BIT
134
вы вообще читали всю ветку? там написано, что не так в решении со стэк оферфлоу. я даже процитировал его в прошлом ответе. ведите себя немного адекватнее, не нужно наезжать. мы здесь общаемся и обсуждаем важную тему. я искал решения со стандартными модулями и не через пень колоду. читал документацию по нескольким вроде бы подходящим модулям, искал в поисковиках

Если вы нашли решение помимо сокета, может быть поделитесь, на полном серьезе? Просто это было бы очень полезно. Я тут нашел решение для Linux, но оно такое же костыльное как и для Windows, через subprocess, если интересно, конечно:

Python:
import subprocess

com_run = subprocess.check_output('ip -h -br a | grep UP', shell=True).decode()
default_interface = com_run.split()[0].strip()
local_ipv4 = com_run.split()[2].strip().split("/")[0]
local_ipv6 = com_run.split()[3].strip().split("/")[0]
print(f'Default interface: {default_interface}\nLocal IPv4: {local_ipv4}\nLocal IPv6: {local_ipv6}')
 

Trixxx

Grey Team
04.04.2020
196
153
BIT
20
вы вообще читали всю ветку? там написано, что не так в решении со стэк оферфлоу. я даже процитировал его в прошлом ответе. ведите себя немного адекватнее, не нужно наезжать. мы здесь общаемся и обсуждаем важную тему. я искал решения со стандартными модулями и не через пень колоду. читал документацию по нескольким вроде бы подходящим модулям, искал в поисковиках
Очень разочарован что вы находите мои ответы - наездом. Это не так, я просто упорно не могу понять и добиться от вас ответа на вопрос, чем вам не нравиться socket?) Потому что лично я не знаю решения со стандартными либами, кроме изобретения велосипеда. Может вы просветите, если найдете.

Если вы нашли решение помимо сокета, может быть поделитесь, на полном серьезе? Просто это было бы очень полезно. Я тут нашел решение для Linux, но оно такое же костыльное как и для Windows, через subprocess, если интересно, конечно:

Python:
import subprocess

com_run = subprocess.check_output('ip -h -br a | grep UP', shell=True).decode()
default_interface = com_run.split()[0].strip()
local_ipv4 = com_run.split()[2].strip().split("/")[0]
local_ipv6 = com_run.split()[3].strip().split("/")[0]
print(f'Default interface: {default_interface}\nLocal IPv4: {local_ipv4}\nLocal IPv6: {local_ipv6}')
Это тоже что я имел в виду, сделать в терминале ifconfig с помощью питона, и спарсить нужный ответ - айпишник.
 

Johan Van

Green Team
13.06.2020
350
656
BIT
134
Это тоже что я имел в виду, сделать в терминале ifconfig с помощью питона, и спарсить нужный ответ - айпишник.

Ну да. Я так и сделал. Просто команда поновее )) Если честно, то про нее не знал. Всегда пользовался ifconfig. А тут узнал, что она устарела.
 

Архонт

Green Team
03.12.2019
20
7
BIT
12
если найду ответ обязательно поделюсь
меня интересует именно стандартный модуль языка. решение типа такого.

Python:
import os
os.get_local_ip()

к сожалению, мои исследования завершились неудачей. нет такого решения. возможно, в новых версиях языка что-то добавят.

кстати, кто какой версией питона пользуется?
 

Trixxx

Grey Team
04.04.2020
196
153
BIT
20
если найду ответ обязательно поделюсь
меня интересует именно стандартный модуль языка. решение типа такого.

Python:
import os
os.get_local_ip()

к сожалению, мои исследования завершились неудачей. нет такого решения. возможно, в новых версиях языка что-то добавят.

кстати, кто какой версией питона пользуется?
Интересный вариант) Тогда знаете, есть вариант ещё круче. Предлагаю:

import hucker
hucker.huck(" Pentagon")

Готово, Америка в шоке :D
 

Johan Van

Green Team
13.06.2020
350
656
BIT
134
если найду ответ обязательно поделюсь
меня интересует именно стандартный модуль языка. решение типа такого.

Python:
import os
os.get_local_ip()

к сожалению, мои исследования завершились неудачей. нет такого решения. возможно, в новых версиях языка что-то добавят.

кстати, кто какой версией питона пользуется?

Я на данный момент 3.9. Больше совместимости с разными модулями. А для того, чтобы найти решение, мне кажется, надо покопаться в тех модулях, которые находят ip по имени сетевого интерфейса. К примеру тот же netifaces. Но тогда надо будет покопаться в модулях, которые получают этот дефолтный интерфейс ))

Кстати, одним глазком глянул в getmac. Там они тоже пользуются socket. Не везде, конечно, но пользуют.

если найду ответ обязательно поделюсь
меня интересует именно стандартный модуль языка. решение типа такого.

Python:
import os
os.get_local_ip()

к сожалению, мои исследования завершились неудачей. нет такого решения. возможно, в новых версиях языка что-то добавят.

кстати, кто какой версией питона пользуется?

Залез сейчас в функцию getmac, которая получает сетевой интерфейс по дефолту. Там все довольно просто и интересно:

Python:
data = _read_file("/proc/net/route")
    if data is not None and len(data) > 1:
        for line in data.split("\n")[1:-1]:
            iface_name, dest = line.split("\t")[:2]
            if dest == "00000000":
                return iface_name
    return None

А в описании написано буквально вот что:

Код:
"""Получите интерфейс по умолчанию, прочитав /proc/net/route.

    Это тот же источник, что и команда `route`, однако гораздо быстрее
    быстрее прочитать этот файл, чем вызывать `route`. Если это не удается по какой-либо
    причине, мы можем вернуться к системным командам (например, для платформы.
    которая имеет команду route, но, возможно, не использует /proc?).
    """

Это для Linux соответственно. В Windows такой функции у данной библиотеки нет, почему-то.
То есть, по сути, ничего замудренного. Либо тот же парсинг route, либо чтение из файла.
 
Последнее редактирование:

Архонт

Green Team
03.12.2019
20
7
BIT
12
Интересный вариант) Тогда знаете, есть вариант ещё круче. Предлагаю:

import hucker
hucker.huck(" Pentagon")

Готово, Америка в шоке :D
опять вы ёрничаете. нормально не можете общаться?
это вполне нормальное желание иметь в языке инструменты для работы с сетью. есть же там socket. почему бы не сделать получение локального адреса простым способом?

хотя бы написать обертку для описанных выше способов и включить в состав стандартных модулей.
 

Johan Van

Green Team
13.06.2020
350
656
BIT
134
Залез сейчас в функцию getmac, которая получает сетевой интерфейс по дефолту. Там все довольно просто и интересно:

Python:
data = _read_file("/proc/net/route")
    if data is not None and len(data) > 1:
        for line in data.split("\n")[1:-1]:
            iface_name, dest = line.split("\t")[:2]
            if dest == "00000000":
                return iface_name
    return None

А в описании написано буквально вот что:

Код:
"""Получите интерфейс по умолчанию, прочитав /proc/net/route.

    Это тот же источник, что и команда `route`, однако гораздо быстрее
    быстрее прочитать этот файл, чем вызывать `route`. Если это не удается по какой-либо
    причине, мы можем вернуться к системным командам (например, для платформы.
    которая имеет команду route, но, возможно, не использует /proc?).
    """

Это для Linux соответственно. В Windows такой функции у данной библиотеки нет, почему-то.
То есть, по сути, ничего замудренного. Либо тот же парсинг route, либо чтение из файла.

А дальше идет еще одна функция, которая вызывается, если нет интерфейса в файле:

Python:
def _hunt_linux_default_iface():
    # type: () -> Optional[str]
    # NOTE: for now, we check the default interface for WSL using the
    # same methods as POSIX, since those parts of the net stack work fine.
    methods = [
        _get_default_iface_linux,
        lambda: _popen("route", "-n")
        .partition("0.0.0.0")[2]
        .partition("\n")[0]
        .split()[-1],
        lambda: _popen("ip", "route list 0/0")
        .partition("dev")[2]
        .partition("proto")[0]
        .strip(),
    ]
    return _try_methods(methods)

То есть, по сути, если брать за основу эту функцию, чтобы с ее помощью получить имя интерфейса, а уже на этом основании получить IP, то тут нет ничего запредельного. Пользуются парсингом, по сути параметров.
 

Johan Van

Green Team
13.06.2020
350
656
BIT
134
А дальше идет еще одна функция, которая вызывается, если нет интерфейса в файле:

Python:
def _hunt_linux_default_iface():
    # type: () -> Optional[str]
    # NOTE: for now, we check the default interface for WSL using the
    # same methods as POSIX, since those parts of the net stack work fine.
    methods = [
        _get_default_iface_linux,
        lambda: _popen("route", "-n")
        .partition("0.0.0.0")[2]
        .partition("\n")[0]
        .split()[-1],
        lambda: _popen("ip", "route list 0/0")
        .partition("dev")[2]
        .partition("proto")[0]
        .strip(),
    ]
    return _try_methods(methods)

То есть, по сути, если брать за основу эту функцию, чтобы с ее помощью получить имя интерфейса, а уже на этом основании получить IP, то тут нет ничего запредельного. Пользуются парсингом, по сути параметров.

А немного дальше еще одна функция, которая, в описании которой сказано, что можно еще получить IP и вот так вот:

Python:
def _fetch_ip_using_dns():
    # type: () -> str
    """Determines the IP address of the default network interface.

    Sends a UDP packet to Cloudflare's DNS (1.1.1.1), which should go through
    the default interface. This populates the source address of the socket,
    which we then inspect and return.
    """
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("1.1.1.1", 53))
    ip = s.getsockname()[0]
    s.close()  # NOTE: sockets don't have context manager in 2.7 :(
    return ip

Код:
""Определяет IP-адрес сетевого интерфейса по умолчанию.

    Отправляет UDP-пакет на DNS Cloudflare (1.1.1.1), который должен пройти через
    интерфейс по умолчанию. Это содержит адрес источника сокета,
    который мы затем проверяем и возвращаем.
    """

я пару дней назад поставил 3.10.4
добавили много интересного

Это да. Интересного там много, не спорю. Я даже когда начал кодить на питоне, поставил его поначалу. И все было замечательно, пока какой-то из модулей сказал, что надо ему другую версию. А точнее я об этом прочитал, когда в терминале ошибки полетели. Потому пока 3.9
 
Последнее редактирование:

Архонт

Green Team
03.12.2019
20
7
BIT
12
ну, у меня сейчас несколько версий на дебиане. 3,7 по дефолту вызывается командой "python3", а остальные 3.8, 3.9 и 3.10 вызываются "python3.x"
 

Trixxx

Grey Team
04.04.2020
196
153
BIT
20
опять вы ёрничаете. нормально не можете общаться?
это вполне нормальное желание иметь в языке инструменты для работы с сетью. есть же там socket. почему бы не сделать получение локального адреса простым способом?

хотя бы написать обертку для описанных выше способов и включить в состав стандартных модулей.
Не могу сказать, почему разработчики предпочли сделать именно так. Тот же сокет мог бы быть стандартным модулем, но является расширением. Не надо забывать и то, что сам Пайтон давольно старый язык, на момент создания не была так развита сетевая инфраструктура. В последние годы он стал популярным и начали появляться сторонние библиотеки. Может причина и в том, что на момент создания, работа с сетью не была приоритетом.
 

Архонт

Green Team
03.12.2019
20
7
BIT
12
Не могу сказать, почему разработчики предпочли сделать именно так. Тот же сокет мог бы быть стандартным модулем, но является расширением. Не надо забывать и то, что сам Пайтон давольно старый язык, на момент создания не была так развита сетевая инфраструктура. В последние годы он стал популярным и начали появляться сторонние библиотеки. Может причина и в том, что на момент создания, работа с сетью не была приоритетом.
сокет - это стандартный модуль. его не нужно устанавливать с помощью pip install
также как os, platform, http и т.д.

А немного дальше еще одна функция, которая, в описании которой сказано, что можно еще получить IP и вот так вот:

Python:
def _fetch_ip_using_dns():
    # type: () -> str
    """Determines the IP address of the default network interface.

    Sends a UDP packet to Cloudflare's DNS (1.1.1.1), which should go through
    the default interface. This populates the source address of the socket,
    which we then inspect and return.
    """
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("1.1.1.1", 53))
    ip = s.getsockname()[0]
    s.close()  # NOTE: sockets don't have context manager in 2.7 :(
    return ip

Код:
""Определяет IP-адрес сетевого интерфейса по умолчанию.

    Отправляет UDP-пакет на DNS Cloudflare (1.1.1.1), который должен пройти через
    интерфейс по умолчанию. Это заполняет адрес источника сокета,
    который мы затем проверяем и возвращаем.
    """
возможно, что-то типа этого добавят в стандартные модули. когда-нибудь
 

Trixxx

Grey Team
04.04.2020
196
153
BIT
20
сокет - это стандартный модуль. его не нужно устанавливать с помощью pip install
также как os, platform, http и т.д.
Хм, странно, я почему то подумал что он с пип ставиться. Тогда ваш вопрос разве не отпадает автоматом?
Вопрос риторический)
 

Johan Van

Green Team
13.06.2020
350
656
BIT
134
Хм, странно, я почему то подумал что он с пип ставиться. Тогда ваш вопрос разве не отпадает автоматом?
Вопрос риторический)

В принципе да. Тот код, что я использовал в скрипте сканирования сети, в принципе и является универсальным для обеих ОС. Вернее не так, для всех ОС, так как будет работать везде одинаково. И более универсален, чем получение IP с помощью DNS Cloudflare, как в getmac. Ну, по крайней мере, по моему скромному мнению.
 
  • Нравится
Реакции: Архонт

Архонт

Green Team
03.12.2019
20
7
BIT
12
@zverb ну я же объяснял, почему этот способ не очень. он выглядит как костыль. ведь можно же написать для самого языка модуль на С который будет работать под капотом с самой ОС и определять айпи средствами ОС
или хотя бы обертку для разных ОС с использованием описанных выше способов. Чтобы было красиво, чтобы не надо было думать, как оно там работает. Это так же как работает например
Код:
os.getcwd()
или типа того
 

Johan Van

Green Team
13.06.2020
350
656
BIT
134
@zverb ну я же объяснял, почему этот способ не очень. он выглядит как костыль. ведь можно же написать для самого языка модуль на С который будет работать под капотом с самой ОС и определять айпи средствами ОС
или хотя бы обертку для разных ОС с использованием описанных выше способов. Чтобы было красиво, чтобы не надо было думать, как оно там работает. Это так же как работает например
Код:
os.getcwd()
или типа того

Ну, как идея, это хорошо. Но, очевидно у разработчиков свои мотивы так не делать. Или просто не успели.

ну, у меня сейчас несколько версий на дебиане. 3,7 по дефолту вызывается командой "python3", а остальные 3.8, 3.9 и 3.10 вызываются "python3.x"

Я пользуюсь пока Windows, а все остальное на виртуалках. Почему-то из всего многообразия мне зашел только Mint. Ubuntu, когда то, еще когда была версия 16.04, нравилась. Теперь плакать хочется. Не особо что-то у меня она работает. Кальку ставить на рабочую машину пока желания нет, хоть и хочется попробовать. Если только обеспечить себе, с непривычки, ночку замечательных мгновений... ))) Mint на кодовой базе Debian тоже что-то не зашел. А чистый Debian пока не решаюсь. Мне одно время Free BSD понравилась. Очень уж отзывчивая система )) Но, все же пока винда. Я больше с ней проработал. И не все мне еще в Linux удобно. Хотя, понемногу привыкаю. По функционалу и прочим фишкам линукс-системы мне нравятся больше.

По крайней мере, у них "нескучные обои" :LOL:

Ну, как идея, это хорошо. Но, очевидно у разработчиков свои мотивы так не делать. Или просто не успели.

Хотел глянуть netifaces, но понял, что эта библиотека мне пока не по зубам. Она на C писана, а я в нем пока не в зуб ногой. Так что, тут пока приостановился я )) Но это пока я С не начну учить. Хоть и не скоро, но начну. Вот эту библиотеку можно было бы включить в стандартную комплектацию питона. Вроде бы раньше, до версии 3.7, что ли, в питона даже scapy включена была по умолчанию. Но это не точно. Я просто на форк наткнулся данной библиотеки. И там что-то подобное упоминалось, вроде.
 

Архонт

Green Team
03.12.2019
20
7
BIT
12
Хотел глянуть netifaces, но понял, что эта библиотека мне пока не по зубам. Она на C писана, а я в нем пока не в зуб ногой. Так что, тут пока приостановился я )) Но это пока я С не начну учить. Хоть и не скоро, но начну. Вот эту библиотеку можно было бы включить в стандартную комплектацию питона. Вроде бы раньше, до версии 3.7, что ли, в питона даже scapy включена была по умолчанию. Но это не точно. Я просто на форк наткнулся данной библиотеки. И там что-то подобное упоминалось, вроде.
если не начинал с С и это не универовский предмет, а самостоятельное изучение, возможно стоит начать учить Rust вместо С. Думаю, на нем тоже можно написать модули для питона, но еще и много всего другого
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!