解决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异常。
