欢迎访问宙启技术站
智能推送

解决Python中BadHostKeyException()异常的 实践方法

发布时间:2024-01-16 12:53:58

在Python中,当使用paramiko库连接到SSH服务器时,如果服务器的主机密钥发生更改或者无法验证,就会抛出BadHostKeyException异常。这个异常通常是由于在首次连接到服务器时,服务器的主机密钥没有被接受/保存引起的。

解决BadHostKeyException异常的 实践方法是使用paramiko库提供的SSHClient.connect方法的missing_host_key_policy参数来设置一个策略,以定义当遇到未知主机密钥时应该如何处理。下面是一个示例代码:

import paramiko
from paramiko import BadHostKeyException, SSHException
from paramiko.hostkeys import HostKeyEntry

def verify_host_key(hostname, port, key):
    # 自定义主机密钥验证方法
    # 这个方法可以根据需要进行修改,比如使用数据存储或者远程验证等方式
    known_host = HostKeyEntry()
    known_host.from_state_string(f"{hostname} ssh-rsa {key}")
    if known_host.is@host_trusted:
        return paramiko.AUTH_SUCCESSFUL
    else:
        return paramiko.AUTH_FAILED

def ssh_connect(hostname, port, username, password):
    try:
        client = paramiko.SSHClient()
        # 设置主机密钥验证策略为自定义方法
        client.set_missing_host_key_policy(verify_host_key)
        client.connect(hostname, port, username, password)
        # 连接成功,进行后续操作
        # ...
    except BadHostKeyException as e:
        print(f"Bad host key for {e.hostname}: {e.key}")
        # 验证主机密钥失败,可以选择重新建立连接或者抛出特定异常
    except SSHException as e:
        print(f"SSH connection failed: {str(e)}")
        # SSH连接失败,处理相应的异常
    finally:
        client.close()

在上面的代码中,我们定义了一个verify_host_key函数作为主机密钥验证方法。这个示例方法是一个简单的示例,它将主机密钥添加到一个类似于known_hosts文件的数据存储中,并检查主机是否可信。您可以根据需要自定义此方法。

然后,在ssh_connect函数中,我们先创建一个SSHClient实例,并通过set_missing_host_key_policy方法将verify_host_key方法设置为主机密钥验证策略。然后,使用connect方法建立SSH连接,并处理可能的异常情况。

使用这种方法,您可以根据自己的需求自定义主机密钥验证策略,并更好地管理和处理BadHostKeyException异常。