在我的python腳本中,我需要通過SSH執行一個命令,該命令也將heredoc作爲參數。該命令調用一個交互式腳本,也可以稱爲如下:在pxssh(pexpect)中使用here-document
dbscontrol << EOI
HELP
QUIT
EOI
我還發現this Q&A描述如何做到這一點使用subprocess
但我真的很喜歡pexpect.pxssh
方便。 代碼示例將不勝感激
在我的python腳本中,我需要通過SSH執行一個命令,該命令也將heredoc作爲參數。該命令調用一個交互式腳本,也可以稱爲如下:在pxssh(pexpect)中使用here-document
dbscontrol << EOI
HELP
QUIT
EOI
我還發現this Q&A描述如何做到這一點使用subprocess
但我真的很喜歡pexpect.pxssh
方便。 代碼示例將不勝感激
我沒有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。
有道理。我實際上最終使用'subprocess.Popen',但語法幾乎相同。感謝並享受賞金(很快) – Bostone