在我的ip地址输出中实现CIDR符号掩码时遇到麻烦



我正在处理我自己的个人任务,帮助我提取以"inet address "开头的ip地址。从"ip地址"命令。我还想提取与每个ip地址相关联的接口。

例如:

接口名称| IP地址Eth0 | 192.168.2.100/24Eth1 | 10.10.2.100/20

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

eth0 Link encap:Ethernet HWaddr b8:ac:6f:65:31:e5 inetaddr:192.168.2.100 Bcast:192.168.2.255掩码:255.255.255.0 inet6 addr:fe80::baac:6fff:fe65:31e5/64 Scope:Link UP BROADCAST RUNNING MULTICASTMTU:1500 Metric:1 RX packets:2697529 errors:0 dropped:0 overruns:0frame:0 TX packets:2630541 errors:0 dropped:0 overruns:0 carrier:0txqueuelen:1000 RX bytes:2159382827 (2.0 GiB) TX(1.2 GiB) Interrupt:17

eth1 Link encap:Ethernet HWaddr b8:ac:6f:65:53:e5 inetaddr:10.10.2.100 Bcast:10.10.2.255掩码:255.255.255.0 inet6 addr:fe80::baac:6fff:ff65:31e5/64 Scope:Link UP BROADCAST RUNNING MULTICASTMTU:1500 Metric:1 RX packets:2697529 errors:0 dropped:0 overruns:0frame:0 TX packets:2630541 errors:0 dropped:0 overruns:0 carrier:0txqueuelen:1000 RX bytes:2159382827 (2.0 GiB) TX(1.2 GiB) Interrupt:17

lo链路封装:本地环回网地址:127.0.0.1掩码:255.0.0.0 inet6addr::1/128作用域:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RXpackets:2849 errors:0 dropped:0 overruns:0 frame:0 TX packets:2849errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX

TX bytes:2778290 (2.6 MiB)

ppp0 Link encap:点对点协议inet地址:10.1.3.105P-t-P:10.0.31.18掩码:255.255.255.255 UP pointoppoint RUNNING NOARPMULTICAST MTU:1496 Metric:1 RX packets:102800 errors:0 dropped:0overruns:0 frame:0 TX packets:63437 errors:0 dropped:0 overruns:0carrier:0 collisions:0 txqueuelen:3 RX bytes:148532544 (141.6 MiB) TXbytes:4425518 (4.2 MiB)

vmnet1 Link encap:Ethernet HWaddr 00:50:56:c0:00:01 inet地址:192.168.47.1 Bcast:192.168.47.255掩码:255.255.255.0 inet6地址:fe80:: 250:56ff: fec0:1/64范围:连接运行多播广播MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX报文:49 errors:0 dropped:0 overruns:0 carrier:0 collisions:0txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

vmnet8 Link encap:Ethernet HWaddr 00:50:56:c0:00:08 inet地址:172.16.232.1 Bcast:172.16.232.255掩码:255.255.255.0 inet6地址:fe80::250:56ff:fec0:8/64作用域:连接广播运行组播MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX报文:49 errors:0 dropped:0 overruns:0 carrier:0 collisions:0txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

vmnet9 Link encap:Ethernet HWaddr 00:50:56:c0:01:08 inet地址:172.16.233.1 Bcast:172.16.233.255掩码:255.255.255.0 inet6地址:fe80::250:76ff:fec0:8/64作用域:连接广播运行多播MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX报文:49 errors:0 dropped:0 overruns:0 carrier:0 collisions:0txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

vmnet10 Link encap:Ethernet HWaddr 00:50:56:c0:02:08 inet地址:172.16.234.1 Bcast:172.16.234.255掩码:255.255.255.0 inet6地址:fe80::250:86ff:fec0:8/64作用域:连接广播运行组播MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX报文:49 errors:0 dropped:0 overruns:0 carrier:0 collisions:0txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

下面是我做过的代码:

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('nn'):
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)

虽然这工作得很好,我似乎无法提取子网掩码前缀,如/24,/25,/26与ip地址。

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

我发布了一个完整的工作程序来展示JSON输出的优势:

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']}")

最新更新