如何通过 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"))
我想从 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"))