Fabric2在AWS EC2嵌套SSH本地2022端口抛出paramiko认证异常
问题排查与修复方案
首先可以排除EC2网络阻断的可能:如果是EC2安全组、网络ACL层面阻断了连接,你会收到Connection refused、Connection timed out类报错,不会抛出AuthenticationException认证失败异常,该错误是身份凭证不匹配或者目标服务异常导致的。
常见原因
- 代码账号配置错误:你手动执行的SSH命令使用的用户名是
admin,但代码中目标连接的用户名配置为dummy_user,账号不匹配直接导致认证失败。 - 端口转发未配置:你本地运行时大概率提前配置了本地端口转发,将本地2022端口的流量通过Node1转发到了目标主机,但运行代码的EC2上没有做相同的端口转发配置,代码中访问的
localhost:2022实际指向的是Node1本身的2022端口,对应服务和你本地转发的目标服务不一致,自然认证失败。 - 私钥文件权限异常:SSH要求私钥文件权限必须为600(仅所有者可读),如果上传到EC2的.pem文件权限过高,会被SSH服务拒绝加载,导致第一步连接Node1就认证失败。
- 安全组白名单缺失:运行代码的EC2公网IP没有加入Node1安全组22端口的入站允许列表,也可能抛出认证类异常。
修复步骤
- 修正代码中的账号配置:将目标连接的
user='dummy_user'改为你手动测试用的admin,确认密码参数和你手动输入的密码一致。 - 补充端口转发配置:在运行代码的EC2上提前执行端口转发命令
ssh -L 2022:目标主机IP:22 root_user@A.B.C.D -i example.pem,或者直接修改代码中的目标连接地址为实际的目标主机IP,无需走localhost转发。 - 修正私钥文件权限:在EC2上执行命令
chmod 600 example.pem,保证私钥文件权限符合SSH要求。 - 调整安全组规则:将运行代码的EC2公网IP加入Node1安全组入站规则的22端口允许列表。
- 手动验证链路:在运行代码的EC2上先手动SSH登录Node1,再在Node1会话中执行
ssh admin@localhost -p 2022验证是否可以正常登录,排除环境配置问题后再运行代码。
内容的提问来源于stack exchange,提问作者kusamit
相关产品推荐
相关产品推荐

