2014-01-22 56 views
0

我寫了一個bash腳本,在一個點上自動執行一些軟件的遠程主機上的安裝,就像這樣:調用從bash腳本AA遠程交互式python腳本:輸入請求滯後

ssh [email protected] "<path>/install-script" 

哪裏install-script是一個bash腳本。該bash腳本在某個時候調用另一個bash腳本,該腳本在某個時候調用一個交互式python腳本,然後使用python的raw_input()函數收集用戶輸入。

當我通常(從bash shell)運行安裝腳本時,它會提示並接受輸入。但是,當我的腳本中的上述代碼運行時,直到輸入輸入之後,纔會有提示。

我真正控制的唯一腳本是我的自動化腳本。

我已閱讀此問題:「Python - how can I read stdin from shell, and send stdout to shell and file」。但是,我在正常的bash shell中運行並沒有問題,只能通過遠程命令通過ssh運行。

此問題是否可以從我的腳本中修復(如果是這樣,怎麼辦?),還是我必須修改python腳本?

UPDATE

爲了澄清,輸入提示我指的是從Python腳本中的提示。我沒有輸入SSH密碼(遠程主機有我的公鑰在authorized_keys文件中)。

UPDATE

爲了進一步澄清,我的腳本(bash)的呼籲調用另一個bash腳本,最後調用的Python腳本,它會提示用戶輸入安裝腳本(bash)的。

即慶典 - >的bash - >的bash - >蟒

+0

您需要使用subprocess.Popen或ssh lib才能實現輸入部分。 – Torxed

+0

沿着我的問題中的代碼行:http:// stackoverflow。com/questions/20472288/python-ssh-password-auth-no-external-libraries-or-public-private-keys/20472419#20472419 – Torxed

+0

我知道,但是我的問題中的代碼處理腳本的輸入/輸出通過SSH。注意'elif'是否確定要繼續連接'lower:'這是我給輸入返回到遠程提示的示例。我已經在需要某種形式的操作/用戶輸入的遠程安裝腳本中使用它。 – Torxed

回答

0
ssh [email protected] "<path>/install-script" 

當運行ssh並指定一個命令來調用遠程系統上,通過默認的SSH將不分配一個PTY(僞TTY)爲遠程會話。這意味着您將通過一組pipes而不是TTY與遠程進程進行通信。

寫入管道時,unix程序通常會緩衝其寫入操作。在寫入管道的進程刷新其緩衝區或退出時,將看不到輸出寫入管道,因爲緩衝輸出通常在退出時刷新。除此之外,一個進程可以檢測它是否正在寫入文件,管道或tty,並且可能會調整它的行爲。例如,當從管道讀取命令時,像bash這樣的shell不會打印命令提示符。

您可以強制ssh請求TTY使用-t選項會話:

ssh -tt [email protected] "<path>/install-script" 

參考ssh man page瞭解詳情。