欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python3 使用socket扫描主机端口是否开放

程序员文章站 2022-05-19 11:24:34
python3 使用socket扫描主机端口是否开放说明:测试环境:gevent模块的安装设置清华源 为默认的pip镜像安装gevent模块代码运行效果说明:使用socket和gevent模块实现 多协程扫描指定IP开放的端口测试环境:Windows10 x64 / Python3.7 / 局域网主机IPgevent模块的安装设置清华源 为默认的pip镜像pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/sim...

说明:

使用socket和gevent模块实现 多协程扫描指定IP开放的端口

测试环境:

Windows10 x64 / Python3.7 / 局域网主机IP

设置清华源 为默认的pip镜像

pip3 版本需要先升级到10.0.1以上版本

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip

设置设置清华源 为默认的pip镜像

pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

安装gevent模块

pip3 install gevent

代码

# coding: utf-8

# 要扫描的主机
SCAN_IP = "192.168.10.1"
# socket超时时间设置
TIME_OUT = 0.1
# 开始扫描端口
START_PORT = 1
# 结束扫描端口
STOP_PORT = 500
# 一次并行扫描的端口数
SCAN_PORT_AT_ONCE = 50
# 扫描间隔时间
SLEEP_TIME = 1.7


import socket
import time
import gevent
from gevent import monkey


# 将程序中用到的耗时操作的代码,换为gevent中自己实现的模块
monkey.patch_all()

# 已开放的端口 列表
OPEN_LIST = list()


def scan(port):
    """使用socket扫描主机是否开放某个端口"""
    # 创建socket
    scan_socket = socket.socket()
    # 设置超时时间
    scan_socket.settimeout(TIME_OUT)
    # s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
    if scan_socket.connect_ex((SCAN_IP, port)) == 0:  # 当返回0时, 表示端口开放
        # 记录开放的端口
        OPEN_LIST.append(port)
        print("{}:{} this port is open".format(SCAN_IP, port))
    # 必须关闭这个套接字
    scan_socket.close()


if __name__ == '__main__':
    all_start_time = time.time()
    # 1-65535 , 间隔50
    for num in range(START_PORT, STOP_PORT, SCAN_PORT_AT_ONCE):
        start_port = num
        stop_port = num + SCAN_PORT_AT_ONCE - 1
        # 最大端口限定, 不能超出
        if stop_port > 65535:
            stop_port = 65535
        # 开始时间
        start_time = time.time()
        # 使用gevent模块实现多协程运行扫描
        gevent.joinall([gevent.spawn(scan, port) for port in range(start_port, stop_port)])
        # 一次扫描N个端口后休眠一下, 等待释放socket
        time.sleep(SLEEP_TIME)
        # 结束时间
        end_time = time.time()
        print("这一次扫描的时间为: {}".format(end_time - start_time))
        print("这一次扫描的端口范围: [{} - {}]\n{}当前开放的端口有:{}".format(start_port, stop_port, SCAN_IP, OPEN_LIST))

        all_end_time = time.time()
        print("当前已运行时间为: [{}]".format(all_end_time - all_start_time))
        print("-" * 50)

运行效果

python3 使用socket扫描主机端口是否开放

本文地址:https://blog.csdn.net/u010684603/article/details/107438060