zoukankan      html  css  js  c++  java
  • 通过python获取Windows的生产ip,掩码和网关

    如题,返回的格式为[ip/mask,gateway],例如:['192.168.200.89/24', '192.168.200.1']

    我进行了无数次尝试,获取这个东西确实很麻烦,因为要考虑到Windows主机下有多个网卡都在启用状态,每一个网卡都有一个或IP地址,每个IP地址可能是IPv4也可能是IPv6,默认路由也可能存在多条,不同版本操作系统命令输出的差异,还要考虑到执行的效率问题。因此今天终于摸索到一条思路,实现过程如下:

    先通过route print | find " 0.0.0.0 "来找网关,然后向网关发udp包拆ip包得到本机生产ip,最后通过wmic命令以获取到的ip为过滤条件拿到生产网卡上的网关,ip和掩码信息,再进行计算处理得到最后一个元素【掩码】,下面是干货,都带了思路注释

    def mynet():
        import socket
        from ipaddress import ip_network as ipn
        import re
        #粗略找IP地址的正则表达式,包括掩码在内一起找
        pr = re.compile(r'd{1,3}.d{1,3}.d{1,3}.d{1,3}')
        #通过默认路由得到网关地址,可能存在多条,但只取第一条[0],通过正则找IP得到的列表第三个元素就是网关[2]
        gw = re.findall(pr,os.popen('route print | find " 0.0.0.0 "').read().strip().split('
    ')[0])[2]
        #向网关发udp请求包,避免无脑的随意udp包游荡在内网中,通过udp的ip头部获取到发包的源地址,也就是本机生产地址
        ip = [ (s.connect((gw, 53)), s.getsockname()[0], s.close()) for s in [ socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ] ][0][1]
        #如果本机IP和网关都正确获取到了
        if ip and gw:
            cmd = 'wmic Path Win32_NetworkAdapterConfiguration get DefaultIPGateway,IPAddress,IPSubnet | find "' + ip + '"'
            #通过操作系统wmic命令获取网关,IP和掩码,为了避免意外返回的结果只取有数据的第一行
            nw = [ i for i in os.popen(cmd).read().strip().split('
    ') if i.strip() ][0]
            #在返回的这一行中找IP相关字符,如果生产网卡配置了多个IP,这里会列出多条记录
            nw = re.findall(pr, nw)
            #在找到的IP结果中判断上面获取到的ip和网关是否都在这条记录中
            if ip in nw and gw in nw:
                #网关在第一条,判断一下是不是正确的,然后把网关从列表中去除
                if gw == nw[0]:
                    nw = nw[1:]
                else:
                    return False
                #剩下nw的元素肯定是偶数个,ip和掩码一样一半格式[ip,ip,..,mask,mask]
                #先找到ip在nw中的索引位,ip对应的掩码索引位是整个元素长度除以2再加上ip索引值
                mdex = int(len(nw) / 2 + nw.index(ip))
                mask = str(ipn(ip + '/' + nw[mdex], strict=False)).split('/')[-1]
                return [ip + '/' + mask, gw]
            else:
                return False
        else:
            return False
    
  • 相关阅读:
    【转+补充】在OpenCV for Android 2.4.5中使用SURF(nonfree module)
    Delphi StarOffice Framework Beta 1.0 发布
    Angular ngIf相关问题
    angularjs文档下载
    公众号微信支付开发
    公众号第三方平台开发 教程六 代公众号使用JS SDK说明
    公众号第三方平台开发 教程五 代公众号处理消息和事件
    公众号第三方平台开发 教程四 代公众号发起网页授权说明
    公众号第三方平台开发 教程三 微信公众号授权第三方平台
    公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取
  • 原文地址:https://www.cnblogs.com/boltkiller/p/14180937.html
Copyright © 2011-2022 走看看