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

