Получение сетевой маски в Python - PullRequest
7 голосов
/ 01 июня 2009

Как можно было бы получить сетевую маску сетевого устройства (в Linux желательно, но если она кроссплатформенная, тогда круто)? Я знаю, как в C на Linux, но я не могу найти путь в Python - возможно, минус ctypes. Это или разбор ifconfig. Любой другой путь?

ioctl(socknr, SIOCGIFNETMASK, &ifreq) // C version

Ответы [ 7 ]

8 голосов
/ 02 июня 2009

Это работает для меня в Python 2.2 в Linux:

iface = "eth0"
socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', iface))[20:24])
4 голосов
/ 01 июня 2009

Вы смотрели здесь?

http://docs.python.org/library/fcntl.html

Это работает для меня в python 2.5.2 в Linux. Заканчивал его, когда Бен добился успеха, но все еще здесь он идет (грустно тратить усилия :-)):

vinko@parrot:~$ more get_netmask.py
# get_netmask.py by Vinko Vrsalovic 2009
# Inspired by http://code.activestate.com/recipes/439093/
# and http://code.activestate.com/recipes/439094/
# Code: 0x891b SIOCGIFNETMASK

import socket
import fcntl
import struct
import sys

def get_netmask(ifname):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x891b, struct.pack('256
s',ifname))[20:24])

if len(sys.argv) == 2:
        print get_netmask(sys.argv[1])
vinko@parrot:~$ python get_netmask.py lo
255.0.0.0
vinko@parrot:~$ python get_netmask.py eth0
255.255.255.0
2 голосов
/ 07 января 2019

Модуль netifaces заслуживает упоминания здесь. Прямо из документов:

>>> netifaces.interfaces()
['lo0', 'gif0', 'stf0', 'en0', 'en1', 'fw0']

>>> addrs = netifaces.ifaddresses('en0')
>>> addrs[netifaces.AF_INET]
[{'broadcast': '10.15.255.255', 'netmask': '255.240.0.0', 'addr': '10.0.1.4'}, {'broadcast': '192.168.0.255', 'addr': '192.168.0.47'}]

Работает в Windows, Linux, OS X и, возможно, других UNIX.

2 голосов
/ 13 сентября 2015

У меня была идея положиться на подпроцесс, чтобы использовать простой запрос ifconfig (Linux) или ipconfig (windows) для получения информации (если ip известен). Комментарии приветствуются :

WINDOWS

ip = '192.168.1.10' #Example
proc = subprocess.Popen('ipconfig',stdout=subprocess.PIPE)
while True:
    line = proc.stdout.readline()
    if ip.encode() in line:
        break
mask = proc.stdout.readline().rstrip().split(b':')[-1].replace(b' ',b'').decode()

UNIX-Like

ip = '192.168.1.10' #Example
proc = subprocess.Popen('ifconfig',stdout=subprocess.PIPE)
while True:
    line = proc.stdout.readline()
    if ip.encode() in line:
        break
mask = line.rstrip().split(b':')[-1].replace(b' ',b'').decode()

IP извлекается с использованием сокетного соединения с Интернетом и с использованием getsockname()[0]

2 голосов
/ 16 апреля 2010

Вы можете использовать эту библиотеку: http://github.com/rlisagor/pynetlinux. Примечание: я являюсь автором библиотеки.

1 голос
/ 02 июня 2009

В Windows этот фрагмент кода может быть полезен:

import os
import sys
import _winreg


def main():
    adapter_list_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
        r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards')

    adapter_count = _winreg.QueryInfoKey(adapter_list_key)[0]

    for i in xrange(adapter_count):
        sub_key_name = _winreg.EnumKey(adapter_list_key, i)
        adapter_key = _winreg.OpenKey(adapter_list_key, sub_key_name)
        (adapter_service_name, _) = _winreg.QueryValueEx(adapter_key, "ServiceName")
        (description, _) = _winreg.QueryValueEx(adapter_key, "Description")

        adapter_registry_path = os.path.join(r'SYSTEM\ControlSet001\Services',
            adapter_service_name, "Parameters", "Tcpip")
        adapter_service_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
            adapter_registry_path)
        (subnet_mask, _) = _winreg.QueryValueEx(adapter_service_key, "SubnetMask")
        (ip_address, _) = _winreg.QueryValueEx(adapter_service_key, "IpAddress")

        sys.stdout.write("Name: %s\n" % adapter_service_name)
        sys.stdout.write("Description: %s\n" % description)
        sys.stdout.write("SubnetMask: %s\n" % subnet_mask)
        sys.stdout.write("IpAdress: %s\n" % ip_address)




if __name__ == "__main__":
    main()

Получить список сетевых адаптеров из раздела реестра HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ NetworkCards и извлечь дополнительную информацию о каждом адаптере из HKLM \ SYSTEM \ ControlSet001 \ Services {adapter_guid} \ Parameters \ Tcpip ключ.

Я тестирую его на Windows XP с 2-мя виртуальными адаптерами, все работает нормально. Должно работать в 2000, 2003, Vista тоже.

0 голосов
/ 23 ноября 2016

Используя библиотеку python pyroute2, вы можете получить все атрибуты сетевого элемента:

from pyroute2 import IPRoute
ip = IPRoute()
info = [{'iface': x['index'], 'addr': x.get_attr('IFA_ADDRESS'), 'mask':  x['prefixlen']} for x in ip.get_addr()]

Более подробная информация доступна здесь: http://pyroute2.org/pyroute2-0.3.14p4/iproute.html

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