使用Paramiko的SFTPClient在remotepath中使用通配符

时间:2018-08-15 20:46:25

标签: python sftp 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",但未评估此通配符。 有人可以帮我解决这个问题。

我找到了one solution for SCPClient,但无法解决SFTPClient的问题。

3 个答案:

答案 0 :(得分:0)

Paramiko SFTPClient不支持通配符。

因此,您必须自己列出远程文件夹中的文件,并将其过滤为要下载的文件:

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)

答案 1 :(得分:0)

在检索文件列表之后,fnmatch通常比正则表达式更好:

btn2

答案 2 :(得分:0)

如果您将 SFTPServer 部署在类似 *nix 的系统上,这是一个简单的解决方案,请使用 execute 方法,如下所示:

conn.execute("ls dir/*.csv")