Popenでsshを介してコマンドを発行し、出力を返す関数を作成しようとしています。
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モジュールで解決できるものですか、それとも自分でエスケープを実装する必要がありますか?