我想使用 screen 来保持服务器上的 ssh 会话处于活动状态。如果我可以在登录时自动为我的用户恢复任何正在运行的会话,那就太好了。最直接的方法是将“screen -r”添加到我的 .bashrc 中,这似乎工作正常。我只是想知道这是否会在尚未测试的条件下破坏任何东西。有经验的人可以告诉我这是否是我应该做的吗?
答案1
如果存在会话,则需要screen -R -d
自动附加到现有会话,否则需要创建一个会话。
确保你只在交互式 shell 上执行此操作。~/.bashrc
即使对于非交互式 shell,当其父进程是 rshd 或 sshd 时,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
因为导致 shell 退出的错误会使登录变得困难。
我推荐是不修改服务器上的 shell 初始化文件,而是从客户端明确运行 screen,如下所示
ssh -t host.example.com screen -R -d
(您可能会在客户端上创建一个 shell 别名或桌面环境快捷方式。)这样,您可以轻松选择不运行屏幕,指定备用会话名称等等。
答案2
您的 X 服务器启动脚本通常会启动一个新的 shell,例如,如果您使用 gdm 使用“用户定义会话”登录。
我认为任何不退出的东西都可能导致你的 X 启动挂起。其中包括screen -r
。