Используйте Paramiko AutoAddPolicy с pysftp - PullRequest
0 голосов
/ 07 декабря 2018

Этот код не работает:

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 до получения исключения?

Есть связанный вопрос .Мой вопрос о том, как применить одно из нескольких решений, которые приведены в старом вопросе.

Ответы [ 2 ]

0 голосов
/ 28 августа 2019

Я реализовал auto_add_key в моей pysftp github fork .

auto_add_key добавит ключ к known_hosts, если auto_add_key=True
Как только ключпредставить для хоста в known_hosts этот ключ будет проверен.

Пожалуйста, ответьте Martin Prikryl -> ответ о проблемах безопасности.

Хотя для абсолютной безопасности вам не следует извлекать ключ хоста удаленно, так как вы не можете быть уверены, что на вас уже не атакуют.

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()
0 голосов
/ 07 декабря 2018

pysftp вообще не использует Paramiko SSHClient class , он использует более низкоуровневый Transport class .Таким образом, он не обладает функциональностью 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...