парамико SFTP висит на гете - PullRequest
       17

парамико SFTP висит на гете

2 голосов
/ 11 августа 2010

Я пытаюсь использовать paramiko для получения файла через SFTP.Он подключается, я могу перечислить каталоги и даже загружает первый мегабайт или около того файла, но затем он просто зависает.Нет исключений, нет ошибок, ничего.Он просто висит там бесконечно.

Вот код, с которым я работаю:

import paramiko
t = paramiko.Transport( host )
t.connect( username=uname, password=passwd )
f = paramiko.SFTPClient.from_transport( t )
print f.listdir()
f.get( fname, fname ) #it hangs on this line :\

У меня есть sftp-доступ к рассматриваемому хосту, но нет доступа к оболочке.Хост содержит один файл, который мне нужно регулярно извлекать и обрабатывать в скрипте Python.

Любая помощь с этой проблемой или альтернативные решения для выполнения SFTP в Python приветствуются:)

Ответы [ 2 ]

1 голос
/ 11 августа 2010

Я предлагаю вам запустить Wireshark на клиенте и посмотреть, что происходит на уровне протокола. Вы не сможете прочитать данные в пакетах, поскольку они будут зашифрованы, но вы увидите, что происходит на уровне TCP / IP, и это может дать подсказку.

0 голосов
/ 11 марта 2019

Я испытывал ту же проблему, что и Ульфур. Он опубликовал свое собственное исправление / обходной путь как комментарий к другому ответу, поэтому я решил добавить его как правильный ответ, чтобы сделать его более заметным.

Основная идея состоит в том, чтобы не использовать метод .get(), а циклический переход по строкам. Ниже приведена реализация Python 3.

transport = None
sftp = None

sftp_path = 'some/sftp/path'
dst_path = '/some/local/path'

try:
    transport = paramiko.Transport((SFTP_HOST, SFTP_PORT))
    transport.set_log_channel('delapi')
    transport.connect(username=SFTP_USER, password=SFTP_PASS)
    sftp = paramiko.SFTPClient.from_transport(transport)

    with sftp.open(sftp_path, 'r') as remote:
        with open(dst_path, 'w') as local:
            for line in remote:
                local.write(line)

except SSHException:
    print("SSH error")
finally:
    if sftp:
        sftp.close()
    if transport:
        transport.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...