【发布时间】:2013-03-18 19:14:57
【问题描述】:
我正在尝试编写一个函数,该函数将通过 ssh 和 Popen 发出命令并返回输出。
def remote(cmd):
escaped = escape(cmd)
return subprocess.Popen(escaped, ...).communicate()[0]
我的麻烦是如何实现escape 函数。有没有为此提供帮助的 Python 模块(2.6)?谷歌显示有pipes.quote 和re.escape,但它们似乎只适用于本地运行的命令。将命令传递给 ssh,看来转义需要更加严格:
例如在本地机器上,这是可以的:
echo $(hostname)
当传递给 ssh 时,它必须是:
ssh server "echo \$(hostname)"
此外,双引号可以根据上下文以不同的方式解释。对于文字引号,您需要以下内容:
ssh a4ipe511 "echo \\\"hello\\\""
要进行变量扩展,还要使用双引号:
ssh a4ipe511 "echo \"\$(hostname)\""
如您所见,转义进入 SSH 的命令的规则可能非常复杂。由于这个函数会被任何人调用,恐怕一些复杂的命令会导致函数返回错误的输出。
这是可以通过内置 Python 模块解决的问题,还是我需要自己实现转义?
【问题讨论】: