Python程序中常见的BadHostKeyException()异常解决方案
发布时间:2024-01-16 12:54:32
在Python程序中,BadHostKeyException()异常通常由 Paramiko 模块抛出,当 SSH 客户端连接到远程主机时,发现主机的公钥发生了变化,导致无法验证主机的有效性时,就会引发此异常。这通常是由于主机的公钥发生了变化,可能是由于主机重新安装了操作系统、更换了硬件、重装了 SSH 服务等原因。在这种情况下,为了防止中间人攻击,SSH 客户端会拒绝连接,并引发 BadHostKeyException()异常。
解决方案:
1. 接受并信任新的公钥:如果你确定主机的公钥发生了变化,但你希望继续连接到该主机,可以通过手动接受并信任新的公钥来解决这个问题。以下是一个示例代码:
import paramiko
ssh_client = paramiko.SSHClient()
ssh_client.load_system_host_keys()
try:
ssh_client.connect('hostname', username='username', password='password')
except paramiko.BadHostKeyException as e:
# 获取远程主机的公钥
remote_public_key = e.expected_key.get_base64()
# 提示用户主机的公钥发生了变化,并询问是否继续连接
print(f"WARNING: Host key changed for hostname
New public key fingerprint: {remote_public_key}")
response = input("Do you want to continue connecting? (yes/no): ")
if response.lower() == 'yes':
# 接受并信任新的公钥
ssh_client._policy.missing_host_key(ssh_client, e.hostname, e.expected_key)
# 重新连接到主机
ssh_client.connect(e.hostname, username='username', password='password')
else:
print("Connection aborted by user")
except Exception as e:
print(f"Error: {str(e)}")
2. 拒绝连接到主机:如果你对主机的公钥发生了变化感到怀疑,或者不确定是否应该继续连接到该主机,可以选择拒绝连接并强制用户重新确认主机的有效性。以下是一个示例代码:
import paramiko
ssh_client = paramiko.SSHClient()
ssh_client.load_system_host_keys()
try:
ssh_client.connect('hostname', username='username', password='password')
except paramiko.BadHostKeyException as e:
# 获取远程主机的公钥
remote_public_key = e.expected_key.get_base64()
# 提示用户主机的公钥发生了变化,并询问是否继续连接
print(f"WARNING: Host key changed for hostname
New public key fingerprint: {remote_public_key}")
response = input("Do you want to continue connecting? (yes/no): ")
if response.lower() == 'yes':
print("Connection aborted by user")
else:
raise e
except Exception as e:
print(f"Error: {str(e)}")
无论你选择接受并信任新的公钥还是拒绝连接到主机,都需要提示用户主机的公钥发生了变化,并询问用户是否继续连接。这是为了防止中间人攻击,并确保用户明确了解并确认连接的主机的有效性。
以上是常见的 BadHostKeyException()异常的解决方案,具体的处理方法可以根据实际情况进行适当的调整和优化。
