如何通过 Python 正则表达式从 arp 输出中获取 IP 地址和 mac 地址?

How do I get ip address and mac address from arp output via Python regex?

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

$ 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}) 的正则表达式和 macs (?P<mac>[0-9a-f]{2}[:]){5}([0-9a-f]{2}) 的正则表达式每个都可以正常工作。我怎样才能将这两者结合起来并忽略 ip 地址和 macs 之间的所有内容?我如何改进 ip 地址正则表达式以匹配主机名?如果有更好的替代方法来使用 arp 来同时获取 IP 地址和 macs,我很乐意改用此命令。

为了加入他们而忽略中间信息,只需在中间添加“.*”,这样它就可以匹配任何东西,但不会被分配到一个组:

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

考虑到主机名,捕获第一个字段可能会更好,而无需尝试确保它是正确的 IP 或主机名。只捕获第一个字段,直到 space:

^(?P<ip>[^\s]+)

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

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

我建议从 shell 本身按列提取并减少文本解析的开销。

a = subprocess.check_output(["arp | awk '{print ,}'"], 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])

也可以使用Python scapy模块获取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"))