我想从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,我很乐意使用此命令。
答案 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"))