【问题标题】:Python networking : find MAC address for corresponding interfacesPython网络:查找对应接口的MAC地址
【发布时间】:2018-08-13 17:45:54
【问题描述】:

我从 pmav99 找到了一个脚本。非常感谢他。

import socket
import psutil

def get_ip_addresses(family):
    for interface, snics in psutil.net_if_addrs().items():
        for snic in snics:
            if snic.family == family:
                yield (interface, snic.address, snic.netmask)

ipv4s = list(get_ip_addresses(socket.AF_INET))

print ipv4s

结果是:

[('Local Area Connection* 2', '169.254.189.147', '255.255.0.0'), ('Ethernet', '192.168.18.34', '255.255.255.0'), ('Wi-Fi', '192.168.1.102', '255.255.255.0'), ('Loopback Pseudo-Interface 1', '127.0.0.1', '255.0.0.0')]

但是在 psutil 的 net_if_addrs() 中,它还提供了每个接口的 mac-address。那么如何将mac地址添加到列表中? MAC地址的键名也是address。我找不到获取它的方法。

【问题讨论】:

    标签: python python-2.7 python-sockets


    【解决方案1】:

    我找到了一种简单的方法来获得我想要的结果

    import socket
    import psutil
    
    def get_ip_addresses(family):
        for interface, snics in psutil.net_if_addrs().items():
            for snic in snics:
                if snic.family == -1 :
                    mac = snic.address
                if snic.family == 2 :
                    yield (interface, snic.address, snic.netmask, mac)
    
    ipv4 = list(get_ip_addresses(socket.AF_INET))
    
    print ipv4
    

    结果如下所示:

    [('Local Area Connection* 2', '169.254.189.147', '255.255.0.0', '34-F3-9A-4C-D0-C5'), ('Ethernet', '192.168.18.34', '255.255.255.0', 'C8-5B-76-AC-B7-BC'), ('Wi-Fi', '192.168.1.106', '255.255.255.0', '34-F3-9A-4C-D0-C4'), ('Loopback Pseudo-Interface 1', '127.0.0.1', '255.0.0.0', '00-00-00-00-00-00-00-E0')]
    

    带有对应 ipv4、网络掩码和 mac 地址的连接名称。 希望它对其他访客有帮助:)。

    【讨论】:

      【解决方案2】:

      根据the documentation,MAC 地址由psutil.AF_LINK 家族记录。此代码片段将获取接口名称列表以及 MAC 地址。

      macs = list(get_ip_addresses(psutil.AF_LINK))
      print macs
      

      以下程序将生成从 MAC 地址到 IPV4 地址的映射:

      import socket
      import psutil
      
      def get_ip_addresses(family):
          for interface, snics in psutil.net_if_addrs().items():
              for snic in snics:
                  if snic.family == family:
                      yield (interface, (snic.address, snic.netmask))
      
      ipv4s = dict(get_ip_addresses(socket.AF_INET))
      macs = dict(get_ip_addresses(psutil.AF_LINK))
      mac2ipv4 = {macs[k][0]: ipv4s[k] for k in set(macs) & set(ipv4s)}
      
      print mac2ipv4
      

      【讨论】:

      • 谢谢 Rob,但我也需要接口名称。我找到了一种方法,只需添加 if 即可。 if snic.family == -1 : mac = snic.address if snic.family == 2 : yield (interface, snic.address, snic.netmask, mac)
      • 如果您不介意,请将您的解决方案作为答案发布。然后,如果您决定使用它,请接受您自己的答案(是的,这是允许的)。通过将其发布为答案,未来的Stack Overflow 访问者可能会有所帮助。
      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 2014-08-21
      • 2011-07-07
      相关资源
      最近更新 更多