我正在尝试编写一个函数,该函数将通过 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 模块解决的问题,还是我需要自己实现转义?