0

我正在尝试编写一个函数,该函数将通过 ssh 和 Popen 发出命令并返回输出。

def remote(cmd):
    escaped = escape(cmd)
    return subprocess.Popen(escaped, ...).communicate()[0]

我的麻烦是如何实现该escape功能。有没有为此提供帮助的 Python 模块(2.6)?谷歌显示有pipes.quotere.escape但它们似乎只适用于本地运行的命令。将命令传递给 ssh,似乎转义需要更加严格:

例如在本地机器上,这是可以的:

echo $(hostname)

传递给 ssh 时,它必须是:

ssh server "echo \$(hostname)"

此外,双引号可以根据上下文以不同的方式解释。对于文字引号,您需要以下内容:

ssh a4ipe511 "echo \\\"hello\\\""

为了进行变量扩展,还使用了双引号:

ssh a4ipe511 "echo \"\$(hostname)\""

如您所见,转义进入 SSH 的命令的规则可能会非常复杂。由于这个函数会被任何人调用,恐怕一些复杂的命令会导致函数返回不正确的输出。

这是可以通过内置 Python 模块解决的问题,还是我需要自己实现转义?

4

1 回答 1

1

第一的:

pipes.quotere.escape本地运行的命令无关。他们只是转换一个字符串;在那之后你用它做什么是你的事。因此,无论是 - 特别是pipes.quote- 都适合您想要的。

第二:

如果您想echo $(hostname)在远程主机上使用运行命令ssh,则无需担心 shell 转义,因为subprocess.Popen默认情况下不会将您的命令传递到 shell。因此,例如,这很好用:

>>> import subprocess
>>> subprocess.call([ 'ssh', 'localhost', 'echo $(hostname)'])
myhost.example.com
0

双引号也可以正常工作:

>>> subprocess.call([ 'ssh', 'localhost', 'echo "one   two"; echo three'])
one   two
three
0

我不清楚你是否真的有问题。

于 2013-03-18T19:47:31.040 回答