我想使用 screen 來保持 ssh 會話在我的伺服器上保持活動狀態。如果我可以在登入時自動恢復使用者正在運行的會話,那就太好了。我只是想知道在我尚未測試的條件下這是否會破壞任何東西。這裡有經驗的人可以告訴我這是否是我應該做的?
答案1
您需要screen -R -d
自動附加到現有會話(如果存在),否則建立會話。
確保你僅在互動式 shell 上執行此操作。當其父進程是 rshd 或 sshd 時, Bash 來源~/.bashrc
甚至適用於非互動式 shell(文件中提到了這一點,但很容易錯過)。您可以看出 shell 是互動的,因為$-
包含i
.
case $- in
*i*) screen -Rd;;
esac
這不會輕易讓您在不同的終端機中執行不同的螢幕工作階段。
您需要從螢幕分離,然後退出父 shell 才能登出。這可以透過使用exec screen
代替 來解決screen
。
如果您啟動登入 shell 以外的 shell,您將進入螢幕,這在大多數情況下不是您想要的。我至少會將此限制為當您直接在互動式 ssh 會話中運行時,在您的 中使用以下內容~/.bash_profile
:
case "/$(ps -p $PPID -o comm=)" in
*/sshd) screen -R -d;;
esac
當你用你的程式做複雜的事情時要小心.bashrc
,因為一個錯誤會導致 shell 退出,從而導致登入變得困難。
我什麼推薦是不要修改伺服器上的 shell 初始化文件,而是從客戶端明確地執行 screen,如下所示
ssh -t host.example.com screen -R -d
(您可能會在用戶端上建立 shell 別名或桌面環境捷徑。)這樣您就可以輕鬆選擇不執行 screen、指定備用會話名稱等。
答案2
您的 X 伺服器啟動腳本通常會啟動一個新的 shell,例如,如果您使用「使用者定義的會話」使用 gdm 登入。
我認為任何不退出的事情都可能導致你的 X 啟動掛起。這將包括screen -r
.