python 去获取一个网段内可ping通的所有ip

img

对168.192.1到255.1到255 这个区间进行ping命令
只要能ping通的就记录

以什么样的格式存储呢?txt?

import subprocess

def ping_ip(ip):
    """
    ping指定IP地址,返回结果
    :param ip: IP地址
    :return: 如果ping通返回True,否则返回False
    """
    ret = subprocess.call(['ping', '-c', '2', '-W', '1', ip],
                          stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT)
    return ret == 0

def get_ips(start_ip, end_ip):
    """
    获取指定网段范围内的所有IP地址
    :param start_ip: 起始IP地址,如192.168.0.1
    :param end_ip: 结束IP地址,如192.168.0.255
    :return: 返回IP地址列表
    """
    ips = []
    start = list(map(int, start_ip.split(".")))
    end = list(map(int, end_ip.split(".")))
    for i in range(start[0], end[0] + 1):
        for j in range(start[1], end[1] + 1):
            for k in range(start[2], end[2] + 1):
                for l in range(start[3], end[3] + 1):
                    ip = "{}.{}.{}.{}".format(i, j, k, l)
                    if ping_ip(ip):
                        ips.append(ip)
    return ips

# example usage
start_ip = "192.168.1.1"
end_ip = "192.168.1.255"
ips = get_ips(start_ip, end_ip)
print(ips)

注意,由于在 Windows 上 ping 命令不是像 Linux 那样的内置命令,因此在 Windows 上这个函数可能不能正常工作。同时,由于这个函数需要进行大量的 ping,因此对网络和计算机性能要求高。

  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:利用python ping ip
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以为您提供一个Python程序来实现这个功能。主要思路是使用Python的socket和subprocess模块。以下是代码实现步骤:

    1.首先,导入所需的模块

    import socket
    import subprocess
    

    2.然后,定义一个函数来检测某个IP地址是否可以响应ping命令。该函数中,使用Python的subprocess模块来执行ping命令,并根据返回结果判断该IP是否可达。如果可达,返回True,否则返回False。

    def ping_ip(ip):
        """
        检测IP地址是否能够ping通
        """
        result = subprocess.call('ping %s -n 2 -w 1000' % ip, stdout=subprocess.PIPE)
        if result == 0:
            return True
        else:
            return False
    

    3.接下来,定义一个函数来遍历指定网段内的所有IP地址,并调用上面的ping_ip函数来检测是否可达。如果可达,则将该IP地址记录到一个列表中。

    def scan_ips(start_ip, end_ip):
        """
        扫描指定网段内的所有IP地址,并记录可达的IP地址
        """
        ips = []
        for i in range(int(start_ip.split('.')[3]), int(end_ip.split('.')[3])+1):
            ip = start_ip[:start_ip.rfind('.')+1] + str(i)
            if ping_ip(ip):
                ips.append(ip)
        return ips
    

    4.最后,调用上面定义的scan_ips函数,传入指定的起始和结束IP地址,即可获取指定网段内所有可ping通的IP地址。

    if __name__ == '__main__':
        start_ip = '192.168.1.1'
        end_ip = '192.168.255.255'
        ips = scan_ips(start_ip, end_ip)
        print('可达IP地址数: %d' % len(ips))
        for ip in ips:
            print(ip)
    

    完整代码如下:

    import socket
    import subprocess
    
    def ping_ip(ip):
        """
        检测IP地址是否能够ping通
        """
        result = subprocess.call('ping %s -n 2 -w 1000' % ip, stdout=subprocess.PIPE)
        if result == 0:
            return True
        else:
            return False
    
    def scan_ips(start_ip, end_ip):
        """
        扫描指定网段内的所有IP地址,并记录可达的IP地址
        """
        ips = []
        for i in range(int(start_ip.split('.')[3]), int(end_ip.split('.')[3])+1):
            ip = start_ip[:start_ip.rfind('.')+1] + str(i)
            if ping_ip(ip):
                ips.append(ip)
        return ips
    
    if __name__ == '__main__':
        start_ip = '192.168.1.1'
        end_ip = '192.168.255.255'
        ips = scan_ips(start_ip, end_ip)
        print('可达IP地址数: %d' % len(ips))
        for ip in ips:
            print(ip)