Python多线程扫描主机 二 范围IP&端口的扫描

前言

上文已经实现UI,现在添加主功能,扫描IP功能

Python多线程扫描主机 一 UI实现和展示_shaynerain的博客-CSDN博客通过Python可以通过尝试连接TCP来扫描主机,为此写了个小软件,用来扫描主机。https://blog.csdn.net/shaynerain/article/details/133392207

 系列

Python多线程扫描主机 一 UI实现和展示_shaynerain的博客-CSDN博客

Python多线程扫描主机 二 范围IP&端口的扫描-CSDN博客

Python多线程扫描主机 三 范围IP&端口的扫描-CSDN博客

 

扫描功能

首先导入socket包,然后尝试使用IP和端口进行扫描,完成如下,直接运行可测试

import socket


def scan(ip, port):
    connect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        connect.settimeout(2)
        connect.connect((ip, port))
        connect.close()
        print('{}:{} connect success'.format(ip,port))
    except Exception as e:
        print('{}:{} connect failure'.format(ip,port))
        return False
    else:
        return True


if __name__ == "__main__":
    import time

    spend = time.time()
    ip = "192.168.1.1"
    port = 80
    scan(ip, port)
    spend = time.time() - spend
    print('消耗时间为', spend)

上面脚本直接使用TCP进行尝试连接,并设置了超时时间为2秒,可适当延长,防止有些网络确实因为慢而出错。在mian中尝试连接我的路由器,显示成功,结果如下:

范围扫描

首先扫描范围需要获取起始IP和端口,然后获取截至IP和端口

在获取后,循环创建需要扫描的IP和端口,代码如下


    def get_ports(self):
        """
        获取所有需要扫描的端口
        :return:
        """
        # 创建空的端口列表
        ports = list()
        # 如果是范围端口
        if self.range_com:
            # 获取开始端口
            port1 = self.lineEdit_com_1.text()
            # 获取结束端口
            port2 = self.lineEdit_com_2.text()
            try:
                # 转成数字
                port1 = int(port1)
                # 转成数字
                port2 = int(port2)
                pass
            except Exception as e:
                # 如果出错,则输入的有问题,进行弹窗提示
                QtWidgets.QMessageBox.critical(self, "提示", "检查端口格式是否正确,(格式参考:80)",
                                               QtWidgets.QMessageBox.Ok)
                return None
            # 在端口中进行循环
            for i in range(port1, port2 + 1, 1):
                # 添加到列表
                ports.append(i)
        # 指定端口号
        else:
            # 获取所有端口号
            ports_text = self.textEdit_com.toPlainText()
            # 替换空格
            ports_text = ports_text.replace(' ', '')
            # 替换换行符
            ports_text = ports_text.replace('\n', '')
            # 使用分号进行分割
            ports_text = ports_text.split(';')
            try:
                # 尝试转换成数字
                for i in range(len(ports_text)):
                    # 首先要保证不能是空的
                    if ports_text[i] != '':
                        # 添加到列表
                        ports.append(int(ports_text[i]))
            # 如果异常
            except Exception as e:
                # 提示它是否输入正确
                QtWidgets.QMessageBox.critical(self, "提示", "检查端口格式是否正确,(格式参考:80)",
                                               QtWidgets.QMessageBox.Ok)
                return None
        # 返回所有端口
        return ports

    def get_ips(self):
        """
        获取所有IP
        :return:
        """
        # IP列条
        ips = list()
        # 获取所有端口号
        ports = self.get_ports()
        # 判断是范围还是指定
        if self.range_ip:
            # 范围就需要知道多少个
            ip1 = self.lineEdit_ip_1.text()
            ip2 = self.lineEdit_ip_2.text()
            # 添加到列表中
            ip1_list = self.ip_to_list(ip1)
            ip2_list = self.ip_to_list(ip2)

            # 首先需要不是空的
            if ip2_list is not None and ip1_list is not None:
                # 在开始和结束之间循环,一共四个段,需要嵌套循环四次,来获取所有的
                for i in range(ip1_list[0], ip2_list[0] + 1, 1):
                    for j in range(ip1_list[1], ip2_list[1] + 1, 1):
                        for k in range(ip1_list[2], ip2_list[2] + 1, 1):
                            for m in range(ip1_list[3], ip2_list[3] + 1, 1):
                                # IP循环完,需要在端口中进行循环,来获取最终要尝试连接的IP+端口号
                                for n in ports:
                                    # 添加到列表中
                                    ips.append(("{}.{}.{}.{}".format(i, j, k, m), n))
        # 如果是指定
        else:
            # 获取所有IP
            ips_text = self.textEdit_ip.toPlainText()
            # 替换空格
            ips_text = ips_text.replace(' ', '')
            # 替换回车
            ips_text = ips_text.replace('\n', '')
            # 使用分号分割
            ips_text = ips_text.split(';')
            # 在里面循环检索
            for m in ips_text:
                # 不能有空的
                if m != "":
                    # 现在是符合条件的,在端口中循环
                    for n in ports:
                        # 组合成IP+端口号,添加到列表中
                        ips.append((m, n))
        # 返回所有
        return ips

如此便生成了需要扫描的ip和端口,单线程中可以一个一个扫描。

from: Python多线程扫描主机 二 范围IP&端口的扫描-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值