You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python2.7端口扫描脚本报错:TypeError: thre() takes no arguments (1 given)

问题分析与修复方案

核心错误原因

你遇到的TypeError: thre() takes no arguments (1 given)错误,是因为创建线程时给thre函数传递了参数(i,),但thre函数定义时没有声明接收任何参数。线程启动时会把传入的args参数传递给目标函数,导致参数不匹配。

代码修复步骤

1. 修正线程创建代码

移除线程创建时多余的参数传递,因为thre不需要参数:

for i in range(int(num_threads)):
    thread = threading.Thread(target=thre)  # 删除args=(i,)
    thread.daemon = True
    thread.start()

2. 修复其他代码问题

你的代码还有多处语法和逻辑错误,一并修正:

  • 缩进错误:Python对缩进严格,sshcan内的if判断、except块都存在缩进问题
  • 变量作用域:port是main内的局部变量,sshcan无法直接访问,需改为参数传入
  • 拼写错误:sockect.error应为socket.error
  • print格式错误:字符串格式化语法错误,需调整为正确的格式写法
  • host逻辑错误:读取文件得到主机列表后,不应循环range(5)放入数字,需把读取到的主机放入队列
  • q.join()位置错误:应放在main函数内,确保主线程等待所有任务完成

完整修复后的代码

import socket
import sys
import time
import Queue
import colorama
import threading
from Queue import Queue
from threading import Thread
from colorama import Fore, Back, Style
colorama.init(autoreset=True)


print_lock = threading.Lock()
q = Queue()
num_threads = 10  # 直接使用整数,避免后续类型转换

def sshcan(host, port):  # 添加port参数
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        rez = s.connect_ex((host, int(port)))  # 将port转为整数
        if rez == 0:
            print(Fore.GREEN + Style.DIM + 'PORT {}: Open on {}'.format(port, host))
        s.close()
        time.sleep(0.1)
    except socket.error:  # 修正拼写错误
        print(Fore.RED + Style.DIM + 'Couldn\'t connect to server: {}'.format(host))
    except KeyboardInterrupt:
        print('Stopping...')
        sys.exit()

def thre():
    while True:
        host, port = q.get()  # 从队列取出主机和端口
        sshcan(host, port)
        q.task_done()
    
def main():
    try:
        file_path = raw_input('\033[91m[\033[92m+\033[91m]\033[92m File Path: \033[97m')
        hosts = open(file_path, 'r').read().splitlines()  # 变量名改为hosts避免混淆
        port = raw_input('\033[91m[\033[92m+\033[91m]\033[92m Port: \033[97m')

        # 创建线程
        for _ in range(num_threads):
            thread = threading.Thread(target=thre)
            thread.daemon = True
            thread.start()
        
        # 将主机和端口放入队列
        for host in hosts:
            q.put((host, port))
        
        q.join()  # 等待所有扫描任务完成
    except Exception as e:
        print('Error: {}'.format(e))
        sys.exit()

if __name__ == "__main__":
    main()

关键说明

  • 线程函数thre依赖全局队列获取任务,因此创建线程时无需传递参数
  • 将port与host绑定放入队列,解决sshcan的参数访问问题
  • 修正所有语法错误,保证代码可正常运行
  • 调整q.join()位置,确保主线程等待子线程完成全部扫描任务

内容的提问来源于stack exchange,提问作者Department Marketing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:27:28