Answers:
screen -R -d
如果一个会话存在,则您都需要自动将其附加到现有会话上,否则,都需要创建一个会话。
确保仅在交互式shell上执行此操作。当bash ~/.bashrc
的父进程为rshd或sshd时,它甚至可以提供非交互式shell的Bash源(在文档中已提及,但很容易错过)。您可以说一个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
因为导致外壳退出的错误将使登录变得困难。
我建议不要在服务器上修改外壳初始化文件,而应从客户端显式运行屏幕,如
ssh -t host.example.com screen -R -d
(您可能会在客户端上创建Shell别名或桌面环境快捷方式。)这样,您可以轻松选择不运行屏幕,指定备用会话名称等。
screen -D -R
甚至更好screen -D -RR
吗?
您的X服务器启动脚本通常会启动新的外壳程序,例如,如果您要通过“用户定义的会话”使用gdm登录。
我认为任何不退出的操作都可能导致X启动挂起。那将包括screen -r
。
.bashrc
。但是在其他情况下这可能会成为问题,例如在运行时ssh host.example.com somecommand
(奇怪的是,bash确实会运行.bashrc
)。