Загрузка файлов с SFTP-сервера в списке с помощью удаленной команды с Paramiko в Python - PullRequest
0 голосов
/ 28 июня 2018

Я использую Paramiko для подключения к SFTP-серверу с локального компьютера и загрузки txt-файлов с удаленного пути. Я могу установить успешное соединение, а также распечатать удаленный путь и файлы, но не могу получить файлы локально. Я могу напечатать file_path и file_name, но не могу загрузить все файлы. Ниже код, который я использую:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect (имя хоста = имя хоста, имя пользователя = имя пользователя, пароль = пароль, порт = порт)

remotepath = '/home/blahblah'
pattern = '"*.txt"'
stdin,stdout,stderr = ssh.exec_command("find {remotepath} -name {pattern}".format(remotepath=remotepath, pattern=pattern))
ftp = ssh.open_sftp()
for file_path in stdout.readlines():
   file_name = file_path.split('/')[-1]
   print(file_path)
   print(file_name)
   ftp.get(file_path, "/home/mylocalpath/{file_name}".format(file_name=file_name))

Я могу видеть file_path и file_name, как показано ниже, из оператора print, но получаю ошибку при использовании ftp.get для нескольких файлов. Я могу скопировать один файл, указав имя источника и адресата жестко.

file_path = '/home/blahblah/abc.txt'
file_name = 'abc.txt'
file_path = '/home/blahblah/def.txt'
file_name = 'def.txt'

Я вижу, что один файл загружен, а затем я получаю следующую ошибку:

FileNotFoundErrorTraceback (последний вызов был последним)

Ошибка трассировки:

Traceback (most recent call last):  
File "<stdin>", line 1, in <module>
File "...anaconda3/lib/python3.6/site-packages/paramiko/sftp_client.py", line 769, in get
  with open(localpath, 'wb') as fl:
FileNotFoundError: [Errno 2] No such file or directory: 'localpath/abc.txt\n'

1 Ответ

0 голосов
/ 29 июня 2018

readlines не удаляет перевод строки из строки. Итак, как вы можете видеть из трассировки, вы пытаетесь создать файл с именем abc.txt\n, что невозможно во многих файловых системах, и, в основном, это не то, что вам нужно.

Обрезать трейлинг новых строк из file_path:

for file_path in stdout.readlines():
    file_path = file_path.rstrip()
    file_name = file_path.split('/')[-1]
    # ...

Хотя вы бы избавили себя от многих неприятностей, если бы вы использовали чистое SFTP-решение, вместо того, чтобы взламывать его, выполняя удаленную команду find (что является очень хрупким решением, как намекнуло в комментариях @CharlesDuffy).

См. Вывести список файлов на SFTP-сервере, совпадающих с подстановочным знаком в Python, используя Paramiko .


Примечание: не используйте AutoAddPolicy. Вы потерять безопасность при этом. См. Paramiko "Неизвестный сервер" .

...