gpt4 book ai didi

python - 使用 Python 的 SCPClient 库在文件名中使用通配符

转载 作者:行者123 更新时间:2023-11-30 22:23:56 33 4
gpt4 key购买 nike

我想使用 Python 脚本将文件从远程计算机复制到本地计算机。我只知道文件名的扩展名,所以我想使用通配符来表达文件名。

此外,我想使用 SCPClient Python 库,而不是直接使用 os.system,如标题为 using wildcards in filename in scp in python 的问题中所建议的那样。

但是当我运行以下代码时:

from paramiko import SSHClient
import paramiko
from scp import SCPClient

with SSHClient() as ssh:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.10.100.5', username= 'root', password='Secret')
with SCPClient(ssh.get_transport()) as scp:
scp.get(remote_path='/root/*.py', local_path='.')

我遇到异常

scp.SCPException: scp: /root/*.py: No such file or directory

从 shell 运行效果很好

scp root@10.10.100.5:/root/*.py .

最佳答案

您需要将 sanitize 添加到 get_transport() 中:

with SCPClient(ssh.get_transport(), sanitize=lambda x: x) as scp:
scp.get(remote_path='/root/*.py', local_path='.')

否则通配符将按字面意思处理。

2020 年 9 月编辑:这个答案有些令人困惑。上面的代码清理任何东西,但它提供了强制的清理功能。 Paramiko 没有有我们现在要关闭的默认 sanitizer 。无论清理发生或不发生,都必须来自于实现,因为 Paramiko 无法知道哪些路径在您的特定环境中是安全的。

如果根本不存在任何清理功能,则所有通配符都会按字面解释 - 我认为出于安全原因,因为通配符对于不受信任的输入是危险的。该设计迫使实现通过添加某种 sanitizer 功能来考虑 sanitizer 。如果没有,通配符就不起作用。

为了使通配符发挥作用,需要有一个清理函数来返回清理后的路径。上面的 lambda 是一个虚拟函数,它返回输入给它的任何内容 - 这意味着它根本不执行任何清理操作,但由于现在有一个清理函数,因此通配符现在开始作为通配符使用。

如果您不相信自己的输入,请勿执行此操作。在这种情况下,您需要编写一个适当的清理程序来确保该路径可以安全使用。您将需要编写一个返回清理路径的函数。

关于python - 使用 Python 的 SCPClient 库在文件名中使用通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47926123/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com