Използване на заместващ знак в отдалечен път с помощта на SFTPClient на Paramiko

Искам да копирам файла от отдалечен сървър на локален.

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
Това предполага, че имате shell достъп до сървъра и че това е Linux сървър. Докато този въпрос е за SFTP. - person Martin Prikryl; 14.04.2021
comment
@MartinPrikryl SFTP е съкращението на SSH File Transfer Protocol, така че основно, ако имате SFTP, вие имате Linux сървър, може би имате предвид FTPS! - person Hossein Torabi; 14.04.2021
comment
Абсолютно не. Има SFTP сървъри за всички системи, не само за Linux. И дори на Linux, можете да имате SFTP достъп без достъп до обвивка. - person Martin Prikryl; 14.04.2021
comment
Да, но всъщност е очевидно, че той използва Linux, а Linux не е жизненоважен! Използването на shell и bash е важно - person Hossein Torabi; 15.04.2021
comment
Но не знаем дали OP има достъп до shell. Не казвам, че отговорът ви не е полезен. Но въпросът е за sftp. Вашият отговор не използва SFTP, а shell. Така че трябва да го каже, за да е ясно, че не всеки ще може да използва вашето решение - person Martin Prikryl; 15.04.2021