此代码不起作用:
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
之前,我遇到了异常。
我找不到通过 pysftp 访问客户端实例的不同方法。
AutoAddPolicy
?
有一个相关的问题。我的问题是关于如何应用旧问题中提供的几种解决方案之一。
SSHClient
类,它使用更底层的 Transport
类。所以它不具备 MissingHostKeyPolicy
的
SSHClient
功能。
您必须自己实施。
一种可能的实施方式可以是:
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())
尽管如此,由于 pysftp 中的错误,这仍然可能无法令人满意。我建议你完全改用Paramiko。请参阅 pysftp 与 Paramiko。
我已经在我的
pysftp github fork中实现了
auto_add_key
。
auto_add_key
会将密钥添加到 known_hosts
如果 auto_add_key=True
known_hosts
中的主机出现密钥,就会检查该密钥。
请参考 Martin Prikryl -> answer 关于安全问题。
尽管为了绝对安全,您不应该远程检索主机密钥,因为您无法确定您是否尚未受到攻击。
import pysftp as sftp
def push_file_to_server():
s = sftp.Connection(host='138.99.99.129', username='root', password='pass', auto_add_key=True)
local_path = "testme.txt"
remote_path = "/home/testme.txt"
s.put(local_path, remote_path)
s.close()
push_file_to_server()