将字符串作为命令行参数进行安全使用的最佳方法是什么?我知道使用subprocess.Popen这个使用list2cmdline(),但这似乎不适用于paramiko.例:
from subprocess import Popen
Popen(['touch', 'foo;uptime']).wait()
Run Code Online (Sandbox Code Playgroud)
这会创建一个名为字面的文件foo;uptime,这就是我想要的.相比:
from paramiko import SSHClient()
from subprocess import list2cmdline
ssh = SSHClient()
#... load host keys and connect to a server
stdin, stdout, stderr = ssh.exec_command(list2cmdline(['touch', 'foo;uptime']))
print stdout.read()
Run Code Online (Sandbox Code Playgroud)
这将创建一个名为的文件foo并打印远程主机的正常运行时间.它已uptime作为第二个命令执行,而不是将其用作第一个命令的参数的一部分touch.这不是我想要的.
我尝试在发送之前和之后用反斜杠转义分号list2cmdline,但后来我得到了一个名为的文件foo\;uptime.
此外,它可以正常工作,如果uptime您使用带空格的命令而不是:
stdin, stdout, stderr = ssh.exec_command(list2cmdline(['touch', 'foo;echo test']))
print stdout.read()
Run Code Online (Sandbox Code Playgroud)
这会创建一个字面上调用的文件,foo;echo test因为list2cmdline它用引号括起来.
此外,我试过pipes.quote(),它有同样的效果list2cmdline.
编辑:为了澄清,我需要确保只有一个命令获取远程主机上执行,而不管我收到任何输入数据,这意味着逃脱字符等;, …