paramiko连接ssh报“authentication failed”主因是认证方式不匹配,需确认服务器启用passwordauthentication或pubkeyauthentication,私钥须为pem格式并显式加载;sftp上传前须逐级创建目录;命令执行后需调用recv_exit_status()再读stdout/stderr;连接需配置set_keepalive防止闲置断开。

Paramiko连接SSH时提示“Authentication failed”怎么办
多数情况下,这不是密码错了,而是认证方式不匹配。Paramiko默认只尝试password和publickey两种方式,但远程服务器可能禁用了密码登录,或密钥格式不对(比如用的是OpenSSH 8.8+生成的sk-ssh-ed25519@openssh.com类型密钥,Paramiko目前不支持)。
- 先确认服务器
/etc/ssh/sshd_config中PasswordAuthentication yes或PubkeyAuthentication yes已启用 - 私钥必须是PEM格式(以
-----BEGIN RSA PRIVATE KEY-----开头),若用ssh-keygen -t ed25519生成,需加-m PEM参数导出 - 传密钥时别直接传
~/.ssh/id_ed25519路径,要用paramiko.RSAKey.from_private_key_file()显式加载,且捕获paramiko.ssh_exception.PasswordRequiredException判断是否需要密码保护
用SFTP上传文件时卡住或报“Operation not permitted”
SFTP客户端本身不自动创建父目录,如果目标路径/var/www/html/assets中assets不存在,sftp.put()会失败,错误信息可能是[Errno 13] Permission denied而非明确的“no such file”,容易误判。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 上传前务必用
sftp.mkdir()逐级创建目录,注意捕获IOError(Paramiko 2.x)或OSError(3.x+)判断目录是否存在 - 避免用
sftp.chdir()再put(),路径应始终用绝对路径,相对路径行为依赖当前工作目录,不可靠 - 大文件上传建议启用
callback参数监控进度,否则网络中断时无法感知,例如:sftp.put(local_path, remote_path, callback=lambda x, y: print(f"{x/y*100:.1f}%"))
执行命令后拿不到完整输出,recv_exit_status()返回0但stdout.read()为空
这是因为SSH通道关闭太快,stdout缓冲区还没来得及读完。Paramiko的exec_command()返回的stdin/stdout/stderr是流式对象,不自动等待命令结束。
- 必须显式调用
stdout.channel.recv_ready()轮询,或更稳妥地用stdout.read().decode()——但前提是先调用channel.close()或等channel.exit_status_ready()为True - 简单做法:在
exec_command()后加stdout.channel.recv_exit_status(),它会阻塞直到命令退出,再读stdout - 注意
stderr可能包含关键错误(如command not found),别只读stdout;用stderr.read().decode()一并检查
连接闲置后自动断开,socket.timeout异常频繁出现
不是代码写错了,是SSH服务器设置了ClientAliveInterval(如60秒),超时后强制断连。Paramiko默认不发保活包。
- 初始化
transport后立即设置transport.set_keepalive(30),数值应小于服务端ClientAliveInterval - 若用
SSHClient高层接口,需先获取底层transport:client.get_transport().set_keepalive(30) - keepalive只对已建立的连接有效,重连逻辑要自己实现——Paramiko不自动重试,遇到
SSHException或socket.error需捕获后重建SSHClient实例
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










