代码之家  ›  专栏  ›  技术社区  ›  thinwybk

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

  •  1
  • thinwybk  · 技术社区  · 6 年前

    我想从中获取mac地址和相应的ip地址(例如,作为一个字典,mac地址作为密钥和ip地址)作为值 arp 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的regex (?P<mac>[0-9a-f]{2}[:]){5}([0-9a-f]{2}) 每一个都很好。如何将这两者结合起来,忽略IP地址和Mac之间的所有内容?如何改进IP地址regex以匹配主机名?如果有更好的选择 ARP协议 要同时获得IP地址和Mac,我很乐意使用这个命令。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Poshi    6 年前

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

    (?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]+)
    

    所以第一个有洞和麦克的区域是:

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

    我建议从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])
    
        3
  •  0
  •   Ajay Kumar K K    6 年前

    也可以使用python 斯卡皮 获取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"))