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
相关产品推荐
相关产品推荐

