更一般地说,如果您收到此错误,您应该尝试使用 paramiko 尝试使用的确切参数进行 SSH:
我发现有太多 SSH 密钥会导致我的一些(但不是全部)结构 SSH 连接失败,因为所有密钥都提供给远程主机。过去,格式错误的密钥也为我引发了此错误消息(您可以通过从 中删除密钥来检测它们~/.ssh/
,一次一个。)
不幸的是,Fabric 不尊重您的 .ssh/config 设置。如果要调试它,可以运行以下命令:
#!/usr/bin/env python
import paramiko
paramiko.util.log_to_file("/tmp/paramiko.log")
ssh = paramiko.SSHClient()
# Run this if you get host key errors: see later
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("example.com", username="myuser", password="mypassword")
并检查输出/tmp/paramiko.log
- 您可能会看到如下内容:
INF [20120904-16:58:52.155] thr=1 paramiko.transport: Disconnect (code 2): Too many authentication failures for myuser
您可以在 Fabric env 环境中设置 no_keys:
env.no_keys = True
但是你需要告诉 Fabric 为特定的主机使用特定的密钥。如上所述,您可以在 fabfile 中执行以下操作:
from fabric.api import env
env.key_filename = "/path/to/.ssh/ssk_non_public_key"
更一般地说,这是一个解析 .ssh 配置并提取选择性密钥的函数- 在此密钥中,是要使用的 SSH 密钥。为此,您需要将 IdentityFile 添加到~/.ssh/config
:
Host example.com
IdentityFile /home/jp/.ssh/id_rsa_example
另一个失败的原因可能是paramiko 不能识别所有主机密钥类型。这有点问题:paramiko 悄悄地忽略了主机密钥~/.ssh/known_hosts
,因为它不是它理解的主机密钥格式。尝试使用 -v 进行 ssh-ing 并查看 SSH 说它找到了主机密钥匹配的哪一行:
debug1: Host '1.2.3.4' is known and matches the RSA host key.
debug1: Found key in /home/jp/.ssh/known_hosts:105
您可以尝试删除此行,然后再次执行 ssh 并接受(新?)主机密钥,然后看看 paramiko 是否满意。但是,如果这就是问题所在,并且不能解决问题,那么我就看不到明确的解决方案。