将字符串转义以安全用作命令行参数的最佳方法是什么?我知道 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
.
编辑:为了澄清,我需要确保在远程主机上只执行一个命令,无论我收到什么输入数据,这意味着转义字符,如;
,&
和反引号。