程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用私有密钥使用 Paramiko SSH 客户端进行连接期间出现 BadHostKeyException大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用私有密钥使用 Paramiko SSH 客户端进行连接期间出现 BadHostKeyException?

开发过程中遇到使用私有密钥使用 Paramiko SSH 客户端进行连接期间出现 BadHostKeyException的问题如何解决?下面主要结合日常开发的经验,给出你关于使用私有密钥使用 Paramiko SSH 客户端进行连接期间出现 BadHostKeyException的解决方法建议,希望对你解决使用私有密钥使用 Paramiko SSH 客户端进行连接期间出现 BadHostKeyException有所启发或帮助;

我正在尝试使用 paramiko 将文件从 s3 存储桶上传到外部 SFTP 服务器。我一直收到 BadHostKeyException:服务器“XXXXXXX”的主机密钥不匹配:得到“got_key”预期的“expect_key”。我已经检查过 Automatically updating known_hosts file when host key changes using Paramiko 但不确定“BadHostKeyException”是否是中间人攻击的迹象。有人可以帮忙吗?

#Read ssh key
key_obj = boto3.resource('s3').object(s3_bucket,key_filE)
key_str = key_obj.get()['Body'].read().decode('utf-8')
key = paramiko.RSAKey.from_private_key(io.StringIO(key_str),password='XXX') // password is private key password


#Create SSH clIEnt for SFTP upload
ssh_clIEnt = paramiko.SSHClIEnt()
ssh_clIEnt.set_missing_host_key_policy(paramiko.autoaddPolicy())
ssh_clIEnt.get_host_keys().add('sftp_host','ssh-rsa',key) 
ssh_clIEnt.connect('sftp_host',port=22,username='user_name',pkey=key)
ftp_clIEnt= ssh_clIEnt.open_sftp()

解决方法

您的 SSH/SFTP 服务器主机密钥已更改。发生这种情况时,任何体面的 SSH/SFTP 库或客户端都会警告您和/或阻止连接继续。更改主机密钥是中间人攻击的标志。

发生这种情况时,您应该联系您的服务器管理员,询问主机密钥更改是否合法(例如,服务器已重新安装)。如果服务器密钥没有改变,你可能会受到攻击。

如果更改的密钥是合法的,管理员应该提前警告您。无论如何,在这种情况下,请更新您的代码或配置中的主机密钥。在您的情况下,它是 get_host_keys().add 调用。在其他情况下,主机密钥可能缓存在 .ssh/known_hosts 文件中。


请注意,主机密钥与用于对 SSH 服务器 (RSAKey.from_private_key) 进行身份验证的“私钥” 无关。您可能想阅读我的文章 Understanding SSH key pairs。


相关问题:Verify host key with pysftp。

,

ssh_client.get_host_keys().add('sftp_host','ssh-rsa',key) 导致了这里的问题。它实际上将我的私钥添加为主机密钥,并与来自服务器的主机密钥进行比较,因此我得到的主机密钥不匹配。我已经使用 key.geT_Base64() 获取主机的 pub 密钥并将其添加到已知主机,然后在连接方法期间使用它来验证连接方法期间生成的主机密钥

#Read ssh key
key_obj = boto3.resource('s3').object(s3_bucket,key_filE)
key_str = key_obj.get()['Body'].read().decode('utf-8')
key = paramiko.RSAKey.from_private_key(io.StringIO(key_str),password='XXX') // password is private key password

#Get pub key to add to known hosts
key_pub = paramiko.RSAKey(data=decodebytes(bytes(key.geT_Base64(),'utf-8')),password='sftp_key_password')

#Create SSH client for SFTP upload
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoaddPolicy())
ssh_client.get_host_keys().add('sftp_host',key_pub)
ssh_client.connect('sftp_host',port=22,username='user_name',pkey=key)
ftp_client= ssh_client.open_sftp()

#Upload gz using SFTP    
def upload_file(file_name,pandasdf,sep='|',encoding='utf-8'):
    with gzip.open(ftp_client.open(file_name,"w+",32768),'w+') as f:
        f.write(bytes(pandasdf.to_csv(index=false,sep=sep),encoding=encoding))

#Call upload file function
try:
    upload_file(file_name,pandasdf)
except Exception as e:
    print(E)
    print('Error while uploading file to SFTP ' + file_name)
    raise e

#Close SFTP and file resources opened
ftp_client.close()
ssh_client.close() 

大佬总结

以上是大佬教程为你收集整理的使用私有密钥使用 Paramiko SSH 客户端进行连接期间出现 BadHostKeyException全部内容,希望文章能够帮你解决使用私有密钥使用 Paramiko SSH 客户端进行连接期间出现 BadHostKeyException所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: