Существуют ли команды для Windows, Mac OS, Linux, чтобы узнать действующие сетевые настройки?

Пишу код на Python3. Одни из задач моей программы - это узнать MAC адрес и IP адрес.

Вопросы:

  1. Если узнавать действующий IP адрес Windows, то я пользуюсь методом gethostbyname(), но с MAC адресом уже проблема. Единственный выход, который я нашел, это вызывать команду с помощью метода check_output(['getmac', '/v', '/fo', 'list'])(выходит список адаптеров с MAC адресами), но как вы знаете сетевых интерфейсов много (беспроводная сеть, проводная сеть и т.д.). Каким способом, методом получить именно тот MAC адрес, который работает в сети? Может есть специальный метод модуля subprocess или команда в cmd, похожий на метод gethostbyname()?

  2. Ситуация с Mac OS и Linux сложнее. Если вбить в терминале ifconfig, то сетевых интерфейсов куча. Если брать в пример Mac OS, подключаешься к Wi-Fi - интерфейс: en0, подключаешься к проводной сети - интерфейс уже другой. Как узнать в ОС Mac OS и Linux действующие в сети IP адрес и MAC адрес?

Общий вопрос такой: Есть ли способы, методы узнавать в ОС Windows, Mac OS, Linux действующие IP адрес и MAC адрес (которые работают в сети, например Интернет).

Если я не точен в формулировке, простите. Я новичок.

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


Ответы (2 шт):

Автор решения: Sergei Malanin

Ты можеш выяснить на какой системе ты запускаеш скрипт. https://stackoverflow.com/questions/1854/python-what-os-am-i-running-on

после этого ты можеш использовать модуль subprocess что бы запускате необходимую команду в терминале. Потом парсиш результаты и вуаля.

Пример для линукса, но можно подшаманить и для остальных ситем:

import subprocess
from collections import namedtuple

CmdOutput = namedtuple("CmdOutput", ["output_lines", "output_string"])


def execute_sh(cmd: str, ) -> CmdOutput:
    cmd += " 2>&1"
    stdout = subprocess.PIPE
    stderr = subprocess.STDOUT
    p = subprocess.Popen(
        cmd, shell=True, executable="/bin/bash", stdout=stdout, stderr=stderr
    )
    lines = [line.decode('utf-8') for line in p.stdout.readlines()]
    string = "".join(lines)
    return CmdOutput(lines, string)
→ Ссылка
Автор решения: Andy Pavlov

Могу посоветовать обратить внимание на psutil и подметод net_if_addrs():

import psutil
print(psutil.net_if_addrs())

Возвращает объект со всеми интерфейсами, включая их IP и MAC-адрес. Ну и работает везде.

→ Ссылка