将Paramiko AutoAddPolicy与pysftp一起使用 [英] Use Paramiko AutoAddPolicy with pysftp
问题描述
此代码不起作用:
def sftp_connection(self):
import pysftp
connection = pysftp.Connection(self.host, username=self.system_name,
private_key=os.path.join(HOME, '.ssh', 'id_rsa'))
# in the next lines I try to use AutoAddPolicy
client = connection.sftp_client()
client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy)
return connection
这是一个例外:
Traceback (most recent call last):
File "/home/u/src/myapp-glo/myapp_doxis_archiv/tests/test_doxis_archiv.py", line 85, in test_beleg_to_archiv__ftpservercontext
info_dict = beleg_to_archiv(beleg, self.archiv_belegart)
File "/home/u/src/myapp-glo/myapp_doxis_archiv/beleg_to_archiv.py", line 28, in beleg_to_archiv
transfer_log=send_data_via_ftp(temp_directory, archiv_belegart.doxis_archiv)
File "/home/u/src/myapp-glo/myapp_doxis_archiv/beleg_to_archiv.py", line 71, in send_data_via_ftp
with doxis_archiv.sftp_connection() as sftp:
File "/home/u/src/myapp-glo/myapp_doxis_archiv/models.py", line 43, in sftp_connection
private_key=os.path.join(HOME, '.ssh', 'id_rsa'))
File "/home/u/local/lib/python2.7/site-packages/pysftp/__init__.py", line 132, in __init__
self._tconnect['hostkey'] = self._cnopts.get_hostkey(host)
File "/home/u/local/lib/python2.7/site-packages/pysftp/__init__.py", line 71, in get_hostkey
raise SSHException("No hostkey for host %s found." % host)
SSHException: No hostkey for host localhost found.
在尝试设置host_key_policy
之前,我得到了例外.
I get the exception before I try to set the host_key_policy
.
我找不到通过pysftp访问客户端实例的其他方法.
I could not find a different way to access the client instance via pysftp.
是否可以设置 AutoAddPolicy
在我得到例外之前?
Is there a way to set AutoAddPolicy
before I get the exception?
有一个相关的问题.我的问题是关于如何应用旧问题中提供的几种解决方案之一.
There is a related question. My question is about how to apply one of the several solutions which are provided in the old question.
推荐答案
pysftp不使用Paramiko Transport
类.因此它没有 MissingHostKeyPolicy
SSHClient
的功能.
pysftp does not use Paramiko SSHClient
class at all, it uses more low-level Transport
class. So it does not have the MissingHostKeyPolicy
functionality of SSHClient
.
您将不得不自己实现它.
You would have to implement it on your own.
一种可能的实现方式可以是:
One possible implementation can be:
host = 'example.com'
# Loads .ssh/known_hosts
cnopts = CnOpts()
hostkeys = None
if cnopts.hostkeys.lookup(host) == None:
print("New host - will accept any host key")
# Backup loaded .ssh/known_hosts file
hostkeys = cnopts.hostkeys
# And do not verify host key of the new host
cnopts.hostkeys = None
with Connection(host, username=user, private_key=pkey, cnopts=cnopts) as sftp:
if hostkeys != None:
print("Connected to new host, caching its hostkey")
hostkeys.add(host, sftp.remote_server_key.get_name(), sftp.remote_server_key)
hostkeys.save(pysftp.helpers.known_hosts())
这篇关于将Paramiko AutoAddPolicy与pysftp一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!