ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python常用网络获取信息函数

2020-11-29 09:03:49  阅读:399  来源: 互联网

标签:iface return 函数 AF python ip 获取信息 ipv4 netifaces


python常用网络获取信息函数

引用的库:需要额外安装的IPy netifaces scapy

from platform import system
import IPy
import netifaces
from scapy.all import *
from scapy.layers.inet import IP, ICMP
from scapy.layers.l2 import Ether, ARP

可能会有点小问题,如果有就自己改改吧。。有的话也记得

给定一个ip地址获取本机和该ip通信的优先级最高的网卡,linux下返回网卡名字符串,windows返回网卡对象

def get_iface_by_ip(ip):
    pkt = IP(dst=ip)
    return pkt.route()[0]

给定网卡对象获取ipv6的网卡索引index

def get_ipv6_ifindex(iface):
    if system() == "Windows":
        return int(netifaces.ifaddresses(iface.guid)[socket.AF_INET6][-1]["broadcast"].split("%")[-1])
    elif system() == "Linux" or "Darwin":
        return int(netifaces.ifaddresses(iface)[socket.AF_INET6][-1]["broadcast"].split("%")[-1])
    else:
        return int(netifaces.ifaddresses(iface)[socket.AF_INET6][-1]["broadcast"].split("%")[-1])

给定ip地址获取对应的mac地址,该函数无法保证每次都可以获取到,建议也可以使用getmac这个库

def get_mac_by_ip_arp(ip):
    def start():
        arp_ask = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip)
        sendp(arp_ask, verbose=False)

    iface = get_iface_by_ip(ip)
    local_mac = get_if_hwaddr(iface)
    filter_arp = "arp and ether dst " + local_mac
    ans = sniff(filter=filter_arp, timeout=7, store=lambda pkt: pkt[ARP].psrc == ip and pkt[ARP].op == 2,
                started_callback=start, stop_filter=lambda pkt: pkt[ARP].psrc == ip, iface=iface)
    if len(ans) > 0:
        return ans[0][ARP].hwsrc
    else:
        return None

获取网卡的第一个ipv4地址

def get_iface_ipv4(iface):
    if system() == "Windows":
        return netifaces.ifaddresses(iface.guid)[netifaces.AF_INET][0]["addr"]
    elif system() == "Linux" or "Darwin":
        return netifaces.ifaddresses(iface)[netifaces.AF_INET][0]["addr"]
    else:
        return netifaces.ifaddresses(iface)[netifaces.AF_INET][0]["addr"]

获取网卡的第一个ipv6地址

def get_iface_ipv6(iface):
    if system() == "Windows":
        return netifaces.ifaddresses(iface.guid)[netifaces.AF_INET6][0]["addr"]
    elif system() == "Linux" or "Darwin":
        return netifaces.ifaddresses(iface)[netifaces.AF_INET6][0]["addr"]
    else:
        return netifaces.ifaddresses(iface)[netifaces.AF_INET6][0]["addr"]

获取网卡ipv4广播地址

def get_iface_broadcast(iface):
    iface_ipv4 = netifaces.ifaddresses(iface)[netifaces.AF_INET][0]["addr"]
    iface_ipv4_mask = netifaces.ifaddresses(iface)[netifaces.AF_INET][0]["netmask"]
    ips = IPy.IP(iface_ipv4).make_net(iface_ipv4_mask)
    return ips.broadcast().strNormal()

通过名字获取网卡

def get_iface(name):
    if system() == "Windows":
        for _ in IFACES.data:
            if IFACES.data[_].name == name:
                print("Inteface name: \t" + str(IFACES.data[_].name))
                print("Adapter name: \t" + str(IFACES.data[_].description))
                return _, IFACES.data[_]
        return None, None
    elif system() == "Linux" or system() == "Darwin":
        if name in get_if_list():
            print("Inteface name: \t" + name)
            return name, name
        else:
            return None, None
    else:
        return None, None

检查tcp端口是否可用

def check_tcp_available(ip, port, timeout=25):
    time_start = time.time()
    while True:
        time.sleep(1)
        if time.time() - time_start > timeout:
            return False
        try:
            s = socket.socket()
            s.settimeout(1)
            s.connect((ip, port))
            s.close()
            return True
        except:
            pass

检查目标网络是否可达

def check_network_available(ip, timeout=60):
    time_start = time.time()
    while True:
        time.sleep(1)
        if time.time() - time_start > timeout:
            return False
        try:
            ping_pkt = IP(dst=ip, ttl=20) / ICMP()
            count = 10
            ans, _ = sr(ping_pkt*count, timeout=0.5, inter=0.2, verbose=False)
            print("Check...")
            if len(ans) / count > 0.5:
                print("Network available")
                return True
        except:
            pass

在网卡没有配置网关的情况下,获取虚假网关
其实就是网络号后面的第一个ip地址

def get_fake_gateway(ip, mask):
    network_num = IPy.IP(ip).make_net(mask)[0]
    network_seq = network_num.strNormal()
    network_list = network_seq.split(".")
    network_list[-1] = str(int(network_list[-1]) + 1)
    gateway_fake = ".".join(network_list)
    return gateway_fake

通过ip获取对应网卡信息

def get_netiface_info_by_ip(ip):
    pkt = IP(dst=ip)/ICMP()
    iface = pkt.route()[0]
    if system() == "Windows":
        iface_name = iface.name
        iface_mac = get_if_hwaddr(iface)
        iface_ipv4 = netifaces.ifaddresses(iface.guid)[netifaces.AF_INET][0]["addr"]
        iface_ipv4_mask = netifaces.ifaddresses(iface.guid)[netifaces.AF_INET][0]["netmask"]
        iface_ipv4_gateway = None
        if netifaces.AF_INET in netifaces.gateways():
            for each_item in netifaces.gateways()[netifaces.AF_INET]:
                if iface in each_item:
                    iface_ipv4_gateway = each_item[0]
                    break
        if not iface_ipv4_gateway:
            iface_ipv4_gateway = get_fake_gateway(iface_ipv4, iface_ipv4_mask)
        # print(f"Name:\t{iface_name}\n"
        #       f"MAC:\t{iface_mac}\n"
        #       f"IPv4:\t{iface_ipv4}\n"
        #       f"IPv4_Mask:\t{iface_ipv4_mask}\n"
        #       f"IPv4_Gateway:\t{iface_ipv4_gateway}\n")
        return iface, iface_mac, iface_ipv4, iface_ipv4_mask, iface_ipv4_gateway
    elif system() == "Linux" or "Darwin":

        iface_name = iface
        iface_mac = get_if_hwaddr(iface)
        iface_ipv4 = netifaces.ifaddresses(iface)[netifaces.AF_INET][0]["addr"]
        iface_ipv4_mask = netifaces.ifaddresses(iface)[netifaces.AF_INET][0]["netmask"]
        iface_ipv4_gateway = None
        if netifaces.AF_INET in netifaces.gateways():
            for each_item in netifaces.gateways()[netifaces.AF_INET]:
                if iface in each_item:
                    iface_ipv4_gateway = each_item[0]
                    break
        if not iface_ipv4_gateway:
            iface_ipv4_gateway = get_fake_gateway(iface_ipv4, iface_ipv4_mask)
        # print(f"Name:\t{iface_name}\n"
        #       f"MAC:\t{iface_mac}\n"
        #       f"IPv4:\t{iface_ipv4}\n"
        #       f"IPv4_Mask:\t{iface_ipv4_mask}\n"
        #       f"IPv4_Gateway:\t{iface_ipv4_gateway}\n")
        return iface, iface_mac, iface_ipv4, iface_ipv4_mask, iface_ipv4_gateway
    else:
        print("Not support")

标签:iface,return,函数,AF,python,ip,获取信息,ipv4,netifaces
来源: https://blog.csdn.net/weixin_49393427/article/details/110304296

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有