使用 Python 的 SCPClient 库在文件名中使用通配符
Using wildcards in file names using Python's SCPClient library
我想使用 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 .
您需要为您的 get_transport()
添加消毒:
with SCPClient(ssh.get_transport(), sanitize=lambda x: x) as scp:
scp.get(remote_path='/root/*.py', local_path='.')
否则通配符按字面意思处理。
编辑 2020 年 9 月:这个答案有些混乱。上面的代码 不会 清理任何东西,但它提供了强制清理功能。 Paramiko 没有 有一个我们现在要关闭的默认消毒剂。无论消毒发生或不发生,都必须来自实施,因为 Paramiko 无法知道在您的特定环境中哪些路径是安全的。
如果根本没有清理功能,所有通配符都按字面解释 - 我假设出于安全原因,因为通配符对于不受信任的输入是危险的。该设计通过添加某种清理功能来强制实现考虑清理。如果有none,通配符不作为通配符。
要使通配符起作用,需要有一个returns 净化路径的净化函数。上面的 lambda 是一个虚拟函数,returns 无论输入什么 - 这意味着它根本不做任何消毒,但由于现在有一个消毒功能,通配符现在开始作为通配符工作。
如果您不相信自己的输入,请不要这样做。在这种情况下,您需要编写一个适当的消毒程序来确保该路径可以安全使用。您将需要编写一个 returns 清理路径的函数。
我想使用 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 .
您需要为您的 get_transport()
添加消毒:
with SCPClient(ssh.get_transport(), sanitize=lambda x: x) as scp:
scp.get(remote_path='/root/*.py', local_path='.')
否则通配符按字面意思处理。
编辑 2020 年 9 月:这个答案有些混乱。上面的代码 不会 清理任何东西,但它提供了强制清理功能。 Paramiko 没有 有一个我们现在要关闭的默认消毒剂。无论消毒发生或不发生,都必须来自实施,因为 Paramiko 无法知道在您的特定环境中哪些路径是安全的。
如果根本没有清理功能,所有通配符都按字面解释 - 我假设出于安全原因,因为通配符对于不受信任的输入是危险的。该设计通过添加某种清理功能来强制实现考虑清理。如果有none,通配符不作为通配符。
要使通配符起作用,需要有一个returns 净化路径的净化函数。上面的 lambda 是一个虚拟函数,returns 无论输入什么 - 这意味着它根本不做任何消毒,但由于现在有一个消毒功能,通配符现在开始作为通配符工作。
如果您不相信自己的输入,请不要这样做。在这种情况下,您需要编写一个适当的消毒程序来确保该路径可以安全使用。您将需要编写一个 returns 清理路径的函数。