Использование подстановочного знака в удаленном пути с помощью Paramiko SFTPClient

Я хочу скопировать файл с удаленного сервера на локальный.

import paramiko
paramiko.util.log_to_file('/tmp/paramiko.log')

# open transport
username = "user"
host="example.com"
port = 22
transport = paramiko.Transport((host, port))
transport.start_client()
private_key_file = "/home/user/.ssh/id_rsa"
agent = paramiko.Agent()
key = paramiko.RSAKey.from_private_key_file(private_key_file)
transport.auth_publickey(username, key)

# get sftp client
sftp = paramiko.SFTPClient.from_transport(transport)
source = "/home/user/user_1.csv"
target = "/home/local/local_sftp.txt"
sftp.get(x[0], x[1])

Приведенный выше код работает нормально, но я хочу использовать source = "/home/user/user_*.csv", но этот подстановочный знак не оценивается. Может кто-нибудь, пожалуйста, помогите мне решить эту проблему.

Я нашел одно решение для SCPClient, но не смог исправить проблему для SFTPClient.


person rai2048    schedule 15.08.2018    source источник


Ответы (3)


Paramiko SFTPClient не поддерживает подстановочные знаки.

Таким образом, вам нужно самостоятельно составить список файлов в удаленной папке и отфильтровать их по тем, которые вы хотите загрузить:

import re
remote_path = "/home/user"
local_path = "/home/local"

files = sftp.listdir(remote_path)

for filename in files:
    if re.match("^user_.*\\.csv$", filename):
        print(filename)
        sftp.get(remote_path + "/" + filename, local_path + "/" + filename)

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

person Martin Prikryl    schedule 19.08.2018
comment
все получилось спасибо большое - person Kar; 25.12.2020

После получения списка файлов fnmatch обычно лучше, чем регулярное выражение для этого работа:

import fnmatch
for name in sftp.listdir(remote_path):
    if fnmatch.fnmatch(name, "user_*.csv"):
        print(name)
person Provi    schedule 11.12.2018
comment
Я пробовал ваше решение, но все равно не получилось, имя файла похоже на Opt_adv048-2020.12.23.14.05.51.csv.pgp . Я попробовал шаблон как Opt_adv048-*.csv.pgp - person Kar; 25.12.2020

Простое решение, если вы используете SFTPServer, развернутый в системах, подобных * nix, используйте метод execute следующим образом:

conn.execute("ls dir/*.csv")
person Hossein Torabi    schedule 14.04.2021
comment
Это предполагает, что у вас есть доступ к серверу через оболочку и что это сервер Linux. Пока этот вопрос касается SFTP. - person Martin Prikryl; 14.04.2021
comment
@MartinPrikryl SFTP — это аббревиатура протокола передачи файлов SSH, поэтому, если у вас есть SFTP, у вас есть сервер Linux, возможно, вы имеете в виду FTPS! - person Hossein Torabi; 14.04.2021
comment
Точно нет. SFTP-серверы есть для всех систем, не только для Linux. И даже в Linux у вас может быть доступ по SFTP без доступа к оболочке. - person Martin Prikryl; 14.04.2021
comment
Да, но на самом деле очевидно, что он использует Linux, а Linux не является жизненно важным! Использование оболочки и bash важно - person Hossein Torabi; 15.04.2021
comment
Но мы не знаем, есть ли у OP доступ к оболочке. Я не говорю, что ваш ответ бесполезен. Но вопрос касается sftp. В вашем ответе используется не SFTP, а оболочка. Так и должно быть, чтобы было понятно, что не все смогут использовать ваше решение - person Martin Prikryl; 15.04.2021