大佬教程收集整理的这篇文章主要介绍了使用私有密钥使用 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,请注明来意。