将字符串转义以安全用作命令行参数的最佳方法是什么?我知道 using可以解决subprocess.Popen这个问题 using list2cmdline(),但这似乎不适用于 paramiko。例子:
from subprocess import Popen
Popen(['touch', 'foo;uptime']).wait()
这会创建一个名为 literal 的文件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()
这将创建一个名为foo并打印远程主机的正常运行时间的文件。它已uptime作为第二个命令执行,而不是将其用作第一个命令的参数的一部分touch。这不是我想要的。
在发送到 之前和之后,我尝试用反斜杠转义分号list2cmdline,但最后我得到了一个名为foo\;uptime.
uptime此外,如果您使用带空格的命令而不是 ,则它可以正常工作:
stdin, stdout, stderr = ssh.exec_command(list2cmdline(['touch', 'foo;echo test']))
print stdout.read()
这会创建一个文件,字面意思是foo;echo test因为list2cmdline用引号括起来。
另外,我试过pipes.quote()了,效果和list2cmdline.
编辑:为了澄清,我需要确保在远程主机上只执行一个命令,无论我收到什么输入数据,这意味着转义字符,如;,&和反引号。