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

使用pexpect.pxssh登录OverTheWire服务器遇password refused错误求助

解决pxssh登录OverTheWire Bandit服务器时的"password refused"错误

我之前碰到过类似的问题,pxssh作为封装好的SSH客户端,对登录流程的预期比较严格,而Bandit服务器的登录场景(尤其是首次连接)可能和它的默认逻辑不匹配。结合你的情况,我们一步步排查原因和解决方法:

可能的原因

  • 端口参数类型错误:你传递的port是字符串'2220',但pxssh的login方法预期port是整数类型。传递字符串会导致ssh命令无法正确指定端口,默认连接到22端口——而Bandit游戏的服务并不在22端口运行,自然会拒绝密码。
  • 未处理主机密钥确认:首次连接Bandit服务器时,SSH会弹出主机密钥确认提示(Are you sure you want to continue connecting...),pxssh默认不会自动处理这个交互,导致流程卡住,最终表现为"password refused"的错误。
  • pxssh的默认正则匹配不兼容:pxssh预设的密码提示正则(password_regex)可能没有完全匹配Bandit服务器的密码提示文本,导致它没在正确的时机发送密码。

解决方法

方法1:修正参数并禁用主机密钥检查(推荐使用pxssh的方式)

修改代码中的端口类型为整数,并添加SSH选项自动接受主机密钥:

from pexpect import pxssh

s = pxssh.pxssh()
# 添加SSH选项,跳过主机密钥确认步骤
s.ssh_options = ['-o', 'StrictHostKeyChecking=no']
s.ssh_options += ['-o', 'UserKnownHostsFile=/dev/null']  # 可选,避免写入本地known_hosts

hostname = 'bandit.labs.overthewire.org'
username = 'bandit0'
password = 'bandit0'
port = 2220  # 改为整数类型

try:
    s.login(hostname, username, password, port=port)
    print("✅ 登录成功!")
    
    # 测试执行命令(比如查看当前用户)
    s.sendline('whoami')
    s.prompt()  # 等待命令执行完毕并返回提示符
    print(f"当前用户: {s.before.decode().strip()}")
except pxssh.ExceptionPxssh as e:
    print(f"❌ 登录失败: {str(e)}")

方法2:直接使用pexpect.spawn手动控制登录流程(更灵活)

如果pxssh的封装还是有问题,可以绕过pxssh,直接用pexpect.spawn执行ssh命令,完全手动处理每一步交互:

import pexpect

hostname = 'bandit.labs.overthewire.org'
username = 'bandit0'
password = 'bandit0'
port = 2220

# 构建完整的ssh命令
ssh_command = f'ssh {username}@{hostname} -p {port} -o StrictHostKeyChecking=no'
child = pexpect.spawn(ssh_command, timeout=10)

# 等待密码提示
child.expect(r'password:')
# 发送密码
child.sendline(password)

# 等待登录后的提示符(匹配Bandit0的默认提示符)
child.expect(r'bandit0@bandit:~$')
print("✅ 登录成功!")

# 执行测试命令
child.sendline('ls')
child.expect(r'bandit0@bandit:~$')
print("当前目录内容:\n", child.before.decode().strip())

验证思路

  1. 先确认端口参数:用整数2220代替字符串,确保ssh命令连接到正确的端口。
  2. 跳过主机密钥检查:这是首次连接时最常见的卡点,添加StrictHostKeyChecking=no可以避免交互中断流程。
  3. 如果还是失败,可以开启pexpect的调试模式(child.logfile = open('debug.log', 'wb')),查看实际的交互流程,确认pxssh或spawn是否正确捕获了密码提示和提示符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:18:12