python获取linux和windows系统指定接口的IP地址的步骤及代码

实验目的:

用户输入网卡名称,通过函数返回对应的IPv4和IPv6地址。

实验代码:

步骤一: 由于window系统下网卡名称并不是真正的名字,而真正的ID在注册表SYSTEM\\CurrentControlSet\\Control\\Network{4d36e972-e325-11ce-bfc1-08002be10318}目录下。所以需要通过如下代码,返回接口名称和唯一ID的对应关系。

python获取linux和windows系统指定接口的IP地址的步骤及代码

win_ifname.py:

import netifaces as ni
# import winreg as wr

# 将windows下的接口的名称和唯一ID一一对应存入字典并返回
def get_connection_name_from_guid(iface_guids):  
    wr = __import__(\'winreg\', globals(), locals(), [\'wr\'])
    iface_dict = {}
    reg = wr.ConnectRegistry(None, wr.HKEY_LOCAL_MACHINE)
    reg_key = wr.OpenKey(reg, r\'SYSTEM\\CurrentControlSet\\Control\\Network\\{4d36e972-e325-11ce-bfc1-08002be10318}\')

    for i in iface_guids:
        try:
            reg_subkey = wr.OpenKey(reg_key, i + r\'\\Connection\')
            iface_dict[wr.QueryValueEx(reg_subkey, \'Name\')[0]] = i
        except FileNotFoundError:
            pass
    return iface_dict

 # 根据输入的接口名称,返回唯一ID
def win_from_name_get_id(ifname): 
    x = ni.interfaces()
    return get_connection_name_from_guid(x).get(ifname)


if __name__ == \'__main__\':
    import platform

    if platform.system() == \"Windows\":
        print(win_from_name_get_id(\"WLAN\"))

运行结果:

python获取linux和windows系统指定接口的IP地址的步骤及代码

可以看到获取WLAN接口的ID和注册表中查看的一致。

步骤二: 通过接口名称(linux)或者接口ID(windows)找到IPv4和IPv6地址。

from netifaces import ifaddresses, AF_INET, AF_INET6
import platform

# 获取接口IPv4地址
def get_ip_address(ifname):
    if platform.system() == \"Linux\":
        try:
        	# AF_INET表示的是IPv4地址(AF_LINK则表示的是MAC地址)
            return ifaddresses(ifname)[AF_INET][0][\'addr\']
        except ValueError:
            return None
    elif platform.system() == \"Windows\":
    	# 需要首先调用win_from_name_get_id函数,获取接口的ID
        from win_ifname import win_from_name_get_id
        if_id = win_from_name_get_id(ifname)
        if not if_id:
            return
        else:
            return ifaddresses(if_id)[AF_INET][0][\'addr\']
    else:
        print(\'操作系统不支持,本脚本只能工作在Windows或者Linux环境!\')

# 获取接口IPv6地址,和IPv4同理
def get_ipv6_address(ifname):
    if platform.system() == \"Linux\":
        try:
            return ifaddresses(ifname)[AF_INET6][0][\'addr\']
        except ValueError:
            return None
    elif platform.system() == \"Windows\":
        from win_ifname import win_from_name_get_id
        if_id = win_from_name_get_id(ifname)
        if not if_id:
            return
        else:
            # 此处依然要提供WIN的网卡ID, 而不是名字
            return ifaddresses(if_id)[AF_INET6][0][\'addr\']
    else:
        print(\'操作系统不支持,本脚本只能工作在Windows或者Linux环境!\')


if __name__ == \"__main__\":
    if platform.system() == \"Linux\":
        print(get_ip_address(\'ens33\'))
        print(get_ipv6_address(\'ens33\'))
    elif platform.system() == \"Windows\":
        print(get_ip_address(\'WLAN\'))
        print(get_ipv6_address(\'WLAN\'))

测试结果:
windows平台下:

python获取linux和windows系统指定接口的IP地址的步骤及代码

Linux平台下:

python获取linux和windows系统指定接口的IP地址的步骤及代码

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容