Извлечение IPv4-адреса из вывода ifconfig с помощью регулярных выражений - PullRequest
0 голосов
/ 14 апреля 2020

Эй, мне нужна небольшая помощь, чтобы получить IP-адрес шлюза, используя импорт 're' в python. (Я пытаюсь получить «широковещательный» бит в eth0), может кто-нибудь помочь мне с выражением регулярного выражения. Большое спасибо.

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
    inet6 fe80::a00:27ff:feb4:9403  prefixlen 64  scopeid 0x20<link>
    ether 08:00:27:b4:94:03  txqueuelen 1000  (Ethernet)
    RX packets 81508  bytes 94760761 (90.3 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 80331  bytes 134321242 (128.0 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Не уверен, почему вы бы использовали регулярное выражение для вывода оболочки ifconfig, который очень чувствителен к изменениям между дистрибутивами * nix, bsd, et c. et c.

вот чистое python решение:

>>> import netifaces as ni
>>> ni.ifaddresses('en0')[2][0]['broadcast']
u'192.168.0.255'
0 голосов
/ 14 апреля 2020

Ну, вот и то, и другое. Выберите.

import re

s = """
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
    inet6 fe80::a00:27ff:feb4:9403  prefixlen 64  scopeid 0x20<link>
    ether 08:00:27:b4:94:03  txqueuelen 1000  (Ethernet)
    RX packets 81508  bytes 94760761 (90.3 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 80331  bytes 134321242 (128.0 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
"""

# Bit values - see /usr/include/linux/if.h
IFF_UP        = 1<<0
IFF_BROADCAST = 1<<1
IFF_RUNNING   = 1<<6
IFF_MULTICAST = 1<<12

# Method 1 - Collect the flags integer value.
rf = re.compile(r'flags=(?P<flags>\d+)')
m = rf.search(s)
if m:
    flags = int(m.group('flags'))
    print('Your flags {0:d} (decimal) is {0:X}'.format(flags, flags))

    # Note the bitwise and operator here:
    if flags & IFF_BROADCAST:
        print('BROADCAST bit is ON')

# Method 2 - Collect the flag names.
rn = re.compile(r'flags=\d+<(?P<names>.+)>')
m = rn.search(s)
if m:
    names = m.group('names').split(',')
    print('Your names are ', names)
    if 'BROADCAST' in names:
        print('BROADCAST bit is ON')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...