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

使用Paramiko实现无密码SSH连接遇认证错误求助

解决Paramiko无密码远程服务器认证问题

嘿,我完全懂你现在的困扰——终端能轻松无密码连服务器,但用Paramiko写脚本就卡壳在认证上,这种不一致真的让人挠头。咱们来拆解问题,一步步搞定它。

你的代码问题出在哪?

你自定义的SSHClient_noauth类思路是对的(重写_auth方法强制用无密码认证),但调用方式错了:你直接去调用_auth方法,而没有通过子类实例去走正常的connect流程。connect方法内部会自动调用_auth,所以咱们只需要让子类实例去执行connect,就能触发咱们的无密码认证逻辑。

正确的实现代码

下面是调整后的完整可运行代码,我会逐行解释:

import paramiko
from paramiko import SSHClient

# 自定义SSH客户端类,重写认证逻辑
class SSHClientNoAuth(SSHClient):
    def _auth(self, username, *args):
        # 强制使用无密码认证(auth_none)
        self._transport.auth_none(username)

# 1. 实例化咱们的自定义客户端
ssh = SSHClientNoAuth()

# 2. 设置主机密钥策略:自动添加未知主机(测试环境用,生产环境建议用已知密钥)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:
    # 3. 连接服务器:指定主机地址和用户名,不需要密码参数
    ssh.connect("10.xxx.xxx.xxx", username="root")
    
    # 测试:执行一条命令看看是否成功
    stdin, stdout, stderr = ssh.exec_command("echo '连接成功!当前用户:' && whoami")
    # 打印命令输出
    print(stdout.read().decode().strip())
    # 如果有错误输出也打印出来
    if stderr.read():
        print("错误输出:", stderr.read().decode().strip())
finally:
    # 不管成功失败,都要确保关闭连接
    ssh.close()

关键说明

  • 为什么重写_auth?Paramiko默认会尝试多种认证方式(密码、密钥等),但你的服务器只允许无密码认证,所以咱们强制让它只用auth_none。
  • AutoAddPolicy的风险:这个设置会自动信任未知的主机密钥,适合个人测试场景;如果是生产环境,建议预先配置已知主机密钥,避免中间人攻击。
  • 终端能连的原因:Mac终端默认会尝试无密码认证(当你没有指定密钥或密码时),和咱们脚本里的逻辑一致,只是Paramiko需要明确触发这个逻辑。

如果运行还是有问题,可以检查服务器的SSH配置:确保sshd_config里开启了PermitEmptyPasswords yes(如果是无密码登录),或者确认你的用户是否配置了免密的密钥认证?不过你说终端直接root@IP就能连,那应该是前者的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:19:00