首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在我的ip地址输出中实现CIDR标记掩码时出错

在我的ip地址输出中实现CIDR标记掩码时出错
EN

Stack Overflow用户
提问于 2021-10-02 19:00:09
回答 1查看 59关注 0票数 0

我正在做自己的工作,帮助我从linux中的"ip地址“命令中提取以"inet”开头的ip地址。我还想提取与每个ip地址相关联的接口。

例如,如下所示:

接口名称eth0 192.168.2.100/24 eth1 \ 10.10.2.100/20

下面是我正在处理的以下输出:

eth0 Link :以太网HWaddr b8:ac:6f:65:31:e5 inet :192.168.2.100 Bcast:192.168.2.255掩码:255.255.255.0 inet6 addr: fe80::HWaddr:6fff:fe65:31e5/64作用域:连接广播运行组播MTU:1500度量:1 RX数据包:2697529丢弃:0溢出:0帧:0 TX数据包:2630541错误:0溢出:0载波:0碰撞:0 txqueuelen:1000rx:2159382827 (2.0 GiB GiB字节)) TX字节:1389552776(1.2GiB)中断:17 eth1链接附件:以太网HWaddr b8:ac:6f:65:53:e5inaddr:10.10.2.100 Bcast:10.10.2.255掩码:255.255.255.0 inet6地址:fe80::HWaddr:6fff:ff65:31e5/64作用域:连接广播运行组播MTU:1500 RX数据包:1 RX数据包:2697529丢弃:0溢出:0帧:0 TX数据包:2630541错误:0中断:0载波:0 TX队列:0 RX字节:2159382827 (2.0 GiB GiB字节)) TX字节:1389552776(1.2GiB)中断:17 Link :本地回环inet :127.0.0.1掩码:255.0.0.0 inet6 addr::1/128作用域:运行MTU:16436度量:1 RX数据包:2 849错误:0丢弃:0溢出:0帧0 TX数据包:2 849错误:0丢弃:0丢弃:0承运人:0冲突:0 txqueuelen:0 RX字节:2778290 (2.6 MiB) TX字节:2778290 (2.6 MiB) 点到点协议inet :10.1.3.105 bytes:10.0.31.18掩码:255.255.255.255运行ppp0组播MTU:1496度量:1 RX数据包:102800错误:0丢弃:0 TX数据包:0丢弃:0 TX数据包:63437错误:0丢弃:0载波:0碰撞:0 txqueuelen:3 RX字节:148532544 (141.6 MiB) TX字节:4425518 (4.2 MiB) vmnet1链接附件:以太网HWaddr 00:50:56:c0:00:01 inet :192.168.47.1 Bcast:192.168.47.255掩码:255.255.255.0 inet6 addr: fe80:250:56FF:01 0:1/64作用域:连接广播运行的多播MTU:1500米:1 RX数据包:0丢弃:0溢出:0帧:0 TX数据包:0丢弃:0承运人:0:0 txqueuelen:0 RX :0 (0.0 B) TX字节:0 (0.0 B)字节 vmnet8链接附件:以太网HWaddr 00:50:56:c0:00:08内地址:172.16.232.1 Bcast:172.16.232.255掩码:255.255.255.0 inet6 addr: fe80:250:56FF:00 0:8/64范围:连接广播运行的多播MTU:1500米:1 RX数据包:错误:0丢弃:0溢出:0帧:0丢弃:0超出:0载波:0载波:0 txqueuelen:0 RX字节:0 (0.0 B) TX :0字节(0.0 B) vmnet9链接附件:以太网HWaddr 00:50:56:c0:01:08 inet :172.16.233.25Bcast:172.16.233.255掩码:255.255.255.0 inet6 addr: fe80:250:76ff:0.0 0:8/64范围:连接正在运行的广播多播MTU:1500米:1 RX数据包:错误:0丢弃:0超出:0帧:0丢弃:0删除:0载波:0载波:0 txqueuelen:0 RX字节:0 (0.0 B) TX :0字节(0.0 B) vmnet10链接附件:以太网HWaddr 00:50:56:c0:02:08 inet :172.16.234.1 Bcast:172.16.234.255掩码:255.255.255.0 inet6 addr: fe80:250:86ff:02 0:8/64范围:连接正在运行的广播多播MTU:1500米:1 RX数据包:错误:0丢弃:0溢出:0帧:0丢弃:0删除:0载波:0载波:0 txqueuelen:0 RX字节:0 (0.0 B) TX :0字节(0.0 B)

下面是我已经完成和使用过的以下代码:

代码语言:javascript
运行
复制
import re

with open('rawdata.txt', 'r') as file:
    data = file.read()



s = []
subnetM = re.findall(r'(?<=Mask:255.)(.*)', data)
position = 0
for i in subnetM:
    if i == "255.255.0":
        s.insert(position, "/24")
    if i == "255.255.255":
        s.insert(position, "/32")
    if i == "0.0.0":
        s.insert(position, "/8")
    position = position + 1

c = []
for paragraph in data.split('\n\n'):

    ma = re.compile("^(\S+).*?inet addr:(\S+)", re.MULTILINE | re.DOTALL)
    result = ma.match(paragraph)

    if result != None:
        result = ma.match(paragraph)

        interface = result.group(1)
        ip = result.group(2)

        c.append([interface, ip])

print("Interface name | IP address")

for (interface, ip) in c:
    print(interface, ' | ', ip)

虽然这很好,但我似乎无法提取带有ip地址的子网掩码前缀,如/24、/25、/26。

下面是我得到的以下输出:输出

EN

回答 1

Stack Overflow用户

发布于 2021-10-03 09:04:05

我正在发布一个完整的工作程序,以展示JSON输出的优势:

代码语言:javascript
运行
复制
import json
import subprocess

with subprocess.Popen("/usr/sbin/ip --json address".split(), stdout=subprocess.PIPE) as proc:
    ip = json.load(proc.stdout)
for iface in ip:
    name = iface['ifname']
    for info in iface['addr_info']:
        print(f"{name} | {info['local']}/{info['prefixlen']}")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69419392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档