我試圖編寫一個函數,它將通過ssh與Popen發出命令並返回輸出。如何在Python中跳過ssh引用的shell命令
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\\\""
要做到可變exansion,雙引號也可用於:
ssh a4ipe511 "echo \"\$(hostname)\""
正如你所看到的,用來轉義進入SSH命令的規則變得相當複雜。由於這個函數會被任何人調用,恐怕一些複雜的命令會導致函數返回不正確的輸出。
這是可以用內置的Python模塊解決的問題,還是我需要實現逃避自己?
謝謝,您的解決方案工作完美。它看起來像一個shell = False的序列傳遞,解決了這個問題。雖然我認爲這可能仍然是任何想通過傳遞字符串參數並使用shell = True來解決此問題的問題。 – trinth 2013-03-18 22:00:14