当前位置: 移动技术网 > IT编程>脚本编程>Python > python3 使用socket扫描主机端口是否开放

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

2020年07月20日  | 移动技术网IT编程  | 我要评论
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)

运行效果

运行效果

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网