如何通过pythonregex从arp输出中获取ip地址和mac地址?

2024-05-22 09:37:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从Ubuntu上的arp命令行输出中获取mac地址和相应的ip地址(例如,作为一个以mac address为键和ip地址的字典)作为值。在

$ arp
Address                  HWtype  HWaddress           Flags Mask            Iface
XX.X.X.X(XX)                ether   XX:XX:XX:XX:XX:XX   C                     eth0
<host name>                 ether   XX:XX:XX:XX:XX:XX   C                     eth0

ip地址的正则表达式(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})和mac的正则表达式(?P<mac>[0-9a-f]{2}[:]){5}([0-9a-f]{2})各自都能很好地工作。我怎么能把这两者结合起来而忽略ip地址和Mac电脑之间的一切呢?如何改进ip地址正则表达式以匹配主机名?如果有更好的替代方法可以使用arp来同时获得ip地址和mac,我很乐意使用这个命令。在


Tags: 命令行ip字典addressubuntumac地址flags
3条回答

我建议通过减少文本解析的开销,从shell本身和那里按列提取。在

a = subprocess.check_output(["arp | awk '{print $1,$3}'"], shell = True)

# Ip address
for i in a.split('\n')[:-1]:
    print(i.split()[0])

# Mac address
for i in a.split('\n')[:-1]:
    print(i.split()[1])

您也可以使用Pythonscapy模块来获得mac

from scapy.all import *
def get_mac(ip_address):
    responses,unanswered = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip_address),timeout=2,retry=10)
# return the MAC address from a response
    for s,r in responses:
        return r[Ether].src
    return None

print(get_mac("192.168.31.14"))

要加入它们并忽略中间信息,只需在中间添加“.*”,这样它就可以匹配任何内容,但不会分配给组:

(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*([0-9a-f]{2}[:]){5}([0-9a-f]{2})

为了解释主机名,最好不要试图确保第一个字段是正确的IP或主机名。只需捕获第一个字段,直到空间:

^{pr2}$

所以第一个有洞和MAC的场最终是:

^(?P<ip>[^\s]+).*(?P<mac>(?:[0-9a-f]{2}:){5}[0-9a-f]{2})

相关问题 更多 >