简体   繁体   English

使用正则表达式从 ifconfig output 中提取 IPv4 地址

[英]Extract IPv4 address from ifconfig output using regex

Hey i need a little help trying to get the gateway IP from this using the 're' import in python.嘿,我需要一点帮助来尝试使用 python 中的“重新”导入来获取网关 IP。 (I'm trying to get the 'broadcast' bit in eth0) can anyone help me with the regex expression. (我正在尝试在 eth0 中获取“广播”位)任何人都可以帮助我处理正则表达式。 Many thanks.非常感谢。

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

Not sure why you would use regex against shell output of ifconfig which is highly susceptible to changes between distributions of *nix, bsd, etc. etc.不知道为什么要对 ifconfig 的 shell output 使用正则表达式,这很容易受到 *nix、bsd 等分布之间的变化的影响。

here is a pure python solution:这是一个纯 python 解决方案:

>>> import netifaces as ni
>>> ni.ifaddresses('en0')[2][0]['broadcast']
u'192.168.0.255'

Well, here it is both ways.好吧,这是两种方式。 Take your pick.任你选。

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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM