如何使用Paramiko实现ssh-keyscan效果获取全部SSH主机密钥
你当前的代码仅返回单种密钥,是因为SSH连接建立阶段,客户端和服务端会协商选择双方都支持的优先级最高的主机密钥算法,因此单次连接只会返回一种密钥。
要获取所有支持的主机密钥,只需要在每次创建Transport连接时,主动指定要协商的主机密钥类型,轮询所有你需要的类型即可,示例实现如下:
import paramiko host = "x.x.x.x" # 填入你需要获取的所有主机密钥类型 target_key_types = ["ssh-rsa", "ecdsa-sha2-nistp256", "ssh-ed25519"] for key_type in target_key_types: try: # 连接时指定本次使用的主机密钥算法 transport = paramiko.Transport(host) transport.connect(server_host_key_algs=[key_type]) remote_key = transport.get_remote_server_key() print(f"密钥类型: {remote_key.get_name()}") print(f"密钥长度: {remote_key.get_bits()}") print(f"密钥内容(base64): {remote_key.get_base64()}\n") transport.close() except paramiko.SSHException as e: # 服务端不支持该类型密钥时会抛出异常,直接跳过即可 print(f"不支持的密钥类型 {key_type}: {str(e)}\n")
如果需要自动获取服务端支持的所有密钥类型,也可以先读取服务端的算法通告列表再遍历,大多数场景下直接指定常用的密钥类型轮询即可,和ssh-keyscan的实现逻辑一致。
内容的提问来源于stack exchange,提问作者jerryleem412
相关产品推荐
相关产品推荐

