Ubuntu
執行“apt-get install”時,SSH 會話永遠不會關閉
問題
apt-get install
在非互動式 SSH 會話中執行時,會話永遠不會關閉。例子:ssh user@target "sudo apt-get -y install my_package"
my_package
確實安裝正確,但 SSH 會話只是懸空打開。問題
是否有任何標誌可以通過 SSH 開始
apt-get
工作?附加資訊
語境
遠端安裝用於在集成伺服器上自動部署包。一旦我們將一些程式碼更改推送到儲存庫,一個作業就會拉入程式碼,建構包,並在集成時部署它以檢查一切是否正常(就部署而言)。
已經嘗試過和注意事項
- 執行的相同 SSH 會話
apt-get update
乾淨地關閉。請注意,這apt-get update
不是互動式的,而是apt-get install
。這可能表明互動性是一個問題。- 像
ssh user@target "sudo apt-get install my_package && echo Hello"
永遠不會到達的命令echo
。debconf
抱怨它找不到一個好的前端(顯示,Readline),它回退到 Teletype(儘管 Readline 可用)。- 關於 debconf 的前端,通過
-t
SSH 強制 TTY 並沒有幫助。也沒有DEBIAN_FRONTEND=noninteractive
。- 一切都是在 Ubuntu 12_04 LTS 上完成的。
以下關於 SF 的答案起到了作用:
從 cron bash 腳本執行時 ssh 無法執行遠端命令
該
-t
標誌強制進行偽 tty 分配,除非本地沒有 TTY。但是像 in 一樣通過兩次國旗-t -t
只是假裝這樣做。這解決了問題。請參閱 SSH 文件:
-t 強制偽 tty 分配。這可用於在遠端機器上執行任意基於螢幕的程序,這非常有用,例如在實現菜單服務時。多個 -t 選項強制分配 tty,即使 ssh 沒有本地 tty。
現在,為什麼這有效?事實證明,
debconf
不再抱怨日誌中的前端。所以我相信根據需要進行雙重-t
設置(引誘?)debconf
,這允許apt-get install
完成乾淨地結束 SSH 會話。