2016-08-15 65 views
1

在我的python腳本中,我需要通過SSH執行一個命令,該命令也將heredoc作爲參數。該命令調用一個交互式腳本,也可以稱爲如下:在pxssh(pexpect)中使用here-document

dbscontrol << EOI 
HELP 
QUIT 
EOI 

我還發現this Q&A描述如何做到這一點使用subprocess但我真的很喜歡pexpect.pxssh方便。 代碼示例將不勝感激

回答

1

我沒有pexpect方便測試我的答案您的問題,但我有一個建議,應該工作,如果沒有,可能至少讓你更接近。

考慮一下這個命令:

$ ssh oak 'ftp << EOF 
lpwd 
quit 
EOF' 
Local directory: /home/jklowden 
$ 

這是怎麼回事?整個帶引號的字符串作爲單個參數傳遞給ssh,它在遠程處被「執行」。雖然ssh並不清楚這意味着什麼,但是我們知道execv(2)會做什麼:如果execve(2)未能執行其傳遞的參數,那麼execv函數將調用/bin/sh具有相同的參數(in這種情況下,我們引用的字符串)。然後,shell將引用的字符串評估爲單獨的參數,檢測HereDoc重定向,並按平常執行。

使用該信息,並採取快速瀏覽一下pexpect.pxssh文檔,它看起來像你想:

s = pxssh.pxssh() 
... 
s.sendline('ftp << EOF\nlpwd\nquit\nEOF') 

如果還是不行,東西改寫(munging)數據。五分鐘strace(1)會告訴你它發生了什麼事,你可以開始指點。 ;-)

HTH。

+0

有道理。我實際上最終使用'subprocess.Popen',但語法幾乎相同。感謝並享受賞金(很快) – Bostone