【问题标题】:Python Network Interface ScanPython网络接口扫描
【发布时间】:2017-07-13 07:17:55
【问题描述】:

我需要创建一个 Python 脚本来查询网络接口并返回主机名、IP 地址和 mac 地址。

#!/usr/bin/env python3
import netifaces

x = netifaces.interfaces()
i = x[0]

for i in x:
    if i != 'lo':

        print(i)
        face = netifaces.ifaddresses(i)

        print(face)
        i += i
    else:
        continue

这是我正在使用的程序的一个版本。这似乎抓住了我需要的所有数据,但我无法让它打印干净或正确!我正在寻找类似的东西: "网卡:wlan0,ipaddr:10.0.0.1,mac:4651168584541"

我是编程新手,对 python 也很陌生,所以请提供任何帮助!

【问题讨论】:

    标签: python networking python-netifaces


    【解决方案1】:

    所以起初这有点棘手,但这种格式应该允许您从 netifaces 的结果中获取数据。

    import netifaces
    
    x = netifaces.interfaces()
    
    
    for i in x:
        if i != 'lo':
        print('\nInterface: ' + i)
        mac = netifaces.ifaddresses(i)[netifaces.AF_LINK][0]['addr']
        print('Mac addr: ' + mac)
    
        try:
            ip = netifaces.ifaddresses(i)[netifaces.AF_INET][0]['addr']
    
            print('IP addr: {0} '.format(ip))
        except KeyError:
            print('NO IP')
            continue
    

    输出将如下所示:

    Interface: eth0
    Mac add: eo:ie:9:38:ri
    No IP
    
    Interface: wlan0
    Mac addr: 34:po:iu:66
    IP addr: 10.0.0.1
    

    【讨论】:

    • 如果您使用不使用 MAC 地址的协议连接会发生什么,例如PPP还是HDLC?它是否适用于使用 64 位 MAC 地址的协议? IPv6 呢?
    • 不确定从未在这些条件下测试过。我会假设 IPv6 可以正常工作。这是一个家庭作业,所以它已经足够好了。我想netifaces 文档可能会涵盖这一点。即使协议不使用 mac addrs,接口应该有一个也不重要吗?
    • 只有使用 IEEE LAN 协议的接口才会有 MAC 地址,有些会使用 48 位 MAC 地址,有些会使用 64 位 MAC 地址。许多库仅假定 48 位 MAC 地址,但较新的 IEEE LAN 协议使用 64 位 MAC 地址。如果您使用不使用 IEEE LAN 协议的接口进行连接,则没有 MAC 地址。不要假设一切都是以太网或 Wi-Fi。我只是指出,做出假设,就像许多程序员对网络所做的那样,可能会导致问题、错误和安全漏洞。我只是看到为网络发布了这么多垃圾软件。
    • 哈哈感谢您提供的信息。不用担心我的小脚本不会发布给任何人,所以它不会加入垃圾堆
    【解决方案2】:

    请检查链接:

    1. @camflan 在 Getting MAC Address

    2. How to get the physical interface IP address from an interface

      import netifaces
      
      x = netifaces.interfaces()
      
      
      for i in x:
          if i != 'lo':
              print(i)
              print("mac:" + netifaces.ifaddresses(i)[netifaces.AF_LINK][0]['addr'] + "     ipaddr:" + netifaces.ifaddresses(i)[netifaces.AF_INET][0]['addr'])
              i += i
          else:
              continue
      

    【讨论】:

    • 由于某种原因,这对我不起作用。第 9 行我们声明人脸的错误
    • 抱歉乔。你能试试更新的代码吗
    • 仍然出现该语法错误。 face = "mac:" + netifaces.ifaddresses(i)[netifaces.AF_LINK][0]['addr'] + ";ipaddr:" netifaces.ifaddresses(i)[netifaces.AF_INET][0]['addr' ]
    • 它告诉我 netifaces 是一个未解决的引用,我不明白因为它被声明了。
    • 直接去掉了人脸变量赋值和打印。请立即检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2011-02-28
    • 2011-07-25
    相关资源
    最近更新 更多