简体   繁体   English

从IP地址获取MAC地址

[英]Obtain MAC address from IP address

I am just learning python 3.6.4 and I'm trying to get this code to work... 我正在学习python 3.6.4,并且正在尝试使此代码正常工作...

I have a list of ip addresses (on my LAN) and I need to obtain the associated mac address for each ip in the list. 我有一个IP地址列表(在我的LAN上),我需要获取列表中每个IP的关联的MAC地址。

When I run the code I get this error: 当我运行代码时,出现此错误:

ip_addresses_as_bytes = str.encode(ip_addresses) TypeError: descriptor 'encode' requires a 'str' object but received a 'list' ip_addresses_as_bytes = str.encode(ip_addresses)TypeError:描述符“ encode”需要一个“ str”对象,但收到一个“列表”

I can't figure out how to convert the individual list items to bytes. 我不知道如何将单个列表项转换为字节。

import subprocess
import re

def get_mac_addresses(ip_addresses):

            for ip_address in ip_addresses:
                subprocess.Popen(["ping", "-c 1", ip_address], stdout=subprocess.PIPE)

            proc = subprocess.Popen("arp -a", stdout=subprocess.PIPE)

            data = proc.communicate()[0]

            results = []

            ip_address_as_bytes = str.encode(ip_address)
            type(ip_address_as_bytes)  # ensure it is byte representation

            ip_addresses_as_bytes = str.encode(ip_addresses)
            type(ip_addresses_as_bytes)

            for ip_address_as_bytes in ip_addresses_as_bytes[:]:
                if ip_address_as_bytes in data:

                    ip_data = data[data.find(ip_address_as_bytes):]

                    mac = re.search(r"(([a-f\d]{1,2}:){5}[a-f\d]{1,2})", ip_data)

                    if mac is None:
                        mac = re.search(r"(([a-f\d]{1,2}-){5}[a-f\d]{1,2})", ip_data)

                    if mac is not None:
                        mac = mac.groups()[0].replace('-', ':').upper()

                    else:
                        mac = '00:00:00:00:00:00'

                    ip_addresses = ip_addresses_as_bytes.decode()
                    type(ip_addresses)  # ensure it is string representation

                    ip_address = ip_address_as_bytes.decode()
                    type(ip_address)  # ensure it is string representation

                    ip_addresses.remove(ip_address)

                    results += [[ip_address, mac]]

                return results

I appreciate any help. 感谢您的帮助。

Thanks! 谢谢!

Your problem is here: 您的问题在这里:

ip_addresses_as_bytes = str.encode(ip_addresses)

ip_addresses is a list, encode expects a string. ip_addresses是一个列表,编码需要一个字符串。

Use a loop: 使用循环:

ip_addresses_as_bytes = []
for ip_addresse in ip_addresses:
    ip_addresses_as_bytes.append(str.encode(ip_addresses))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM