如何解决paramiko的BadHostKeyException?

0 投票
1 回答
35 浏览
提问于 2025-04-12 15:51

我有以下代码用来连接到一个Linux服务器并执行命令,但即使我已经添加了WarningPolicyAutoAddPolicy,我还是遇到了BadHostKeyException的错误。

            print("---CCCCCCCCCCCCC---",commands)
            client = paramiko.SSHClient()
            client.load_system_host_keys()
            client.set_missing_host_key_policy(paramiko.WarningPolicy)
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect(ipAddress, port=22, username=sshUser, password=sshPassword)
            self.logger.info("executeOnRemoteShell - Created SSH connection to " + ipAddress)
            stdin, stdout, stderr = client.exec_command(commands)
            result = str(stdout.readlines()[0].rstrip())

我不太确定我漏掉了什么,下面是完整的错误信息。

paramiko.ssh_exception.BadHostKeyException: Host key for server '45.32.23.23' does not match: got 'AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGcWA6JnHBbVIGsdC+USD2GOxWNy+R8hiiFiLse75rs1JRTWN8i3ol3yZ4OhFhQl4upZ7f5/scFzw4DqoMrhRIE=', expected 'AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJSELS2mT8SED8I7QFf5YkkvD5n4LCHUkX4ykeemwuqGHOBVHixQMBtKWF9lFuKFhKOCNsifRPK1FfkT23glapI

1 个回答

-2

快速回复:

根据在github上的讨论,解决办法可能是去掉 client.load_system_host_keys() 这一行。

如果你在使用 SSHClient 的 connect() 方法,那么就不要调用 load_host_keys()。

关于 load_system_host_keys,可以查看paramiko 文档

如果文件名保持为 None,系统会尝试从用户本地的“已知主机”文件中读取密钥,这个文件是 OpenSSH 使用的,如果无法读取该文件,也不会抛出异常。

我以前遇到过这个问题。比如说,你有一个服务器,通常会使用某种 SSH 连接,这意味着在你的 known_hosts 文件中会存储预期的身份信息。但是当你通过 paramiko 连接到另一个 SSH 服务器时,比如 paramiko 自己的服务器,你的 paramiko 客户端(因为使用了 "load_system_host_keys" 这一行)会用常规 SSH 服务器的已知数据来进行身份验证,而这些密钥可能不匹配。我解决这个问题的方法是,不使用常规 SSH 过程中的任何内容,而是专门为 paramiko 创建了密钥(在两边都创建)。

更一般来说,paramiko.ssh_exception.BadHostKeyException 并不意味着主机密钥缺失,而是说它要么已经改变,要么你的客户端认为的主机密钥不准确。这是一种安全措施,用来防止中间人攻击。错误信息中的长字符串是经过 base64 编码的非 ASCII 版本,表示你的客户端预期的内容和主机提供的内容。

撰写回答