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

时间:2018-07-09 06:55:56

标签: python arp

我想从Ubuntu上的arp命令行输出中获取mac地址和相应的IP地址(例如,以mac地址为键和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})的正则表达式和macs (?P<mac>[0-9a-f]{2}[:]){5}([0-9a-f]{2})的正则表达式都可以。我该如何结合这两者而忽略IP地址和Mac之间的所有内容?如何改善IP地址正则表达式以匹配主机名?如果有更好的选择,而不是使用arp同时获取ip地址和macs,我很乐意使用此命令。

3 个答案:

答案 0 :(得分:1)

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

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

要考虑主机名,最好在不尝试确保其为正确的IP或主机名的情况下捕获第一个字段。只需捕获第一个字段,直到空格:

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

因此带有孔和MAC的第一个字段最终为:

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

答案 1 :(得分:0)

我建议通过减少文本解析的开销来从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])

答案 2 :(得分:0)

您还可以使用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"))