将“screen -r”放在我的 .bashrc 中是个好主意吗?

mar*_*usw 18 linux ssh debian gnu-screen bashrc

我想使用 screen 使 ssh 会话在我的服务器上保持活动状态。如果我可以在登录时为我的用户自动恢复任何正在运行的会话,那就太好了。这样做的直接方法是将“screen -r”添加到我的 .bashrc 中,这似乎工作正常。我只是想知道这是否会在我尚未测试的条件下破坏任何东西。任何有经验的人都可以告诉我这是否是我应该做的?

Gil*_*il' 21

screen -R -d如果存在会话,您需要自动附加到现有会话,否则创建会话。

确保您只在交互式 shell 上执行此操作~/.bashrc当其父进程是 rshd 或 sshd 时,即使是非交互式 shell 的Bash 源(文档中提到了这一点,但很容易错过)。您可以判断 shell 是交互式的,因为$-包含i.

case $- in
  *i*) screen -Rd;;
esac
Run Code Online (Sandbox Code Playgroud)

这不会轻易让您在不同的终端中运行不同的屏幕会话。

您需要从屏幕上分离,然后退出父 shell 以注销。这可以通过使用exec screen代替来解决screen

如果您启动一个非登录 shell 的 shell,您将进入 screen,这在大多数情况下不是您想要的。我至少会将此限制在您直接在交互式 ssh 会话中运行时,在您的 ssh 会话中包含以下内容~/.bash_profile

case "/$(ps -p $PPID -o comm=)" in
  */sshd) screen -R -d;;
esac
Run Code Online (Sandbox Code Playgroud)

当你做复杂的事情时要小心,.bashrc因为导致 shell 退出的错误会使登录变得困难。


我的建议是不要修改服务器上的 shell 初始化文件,而是从客户端显式运行 screen,如

ssh -t host.example.com screen -R -d
Run Code Online (Sandbox Code Playgroud)

(您可能会在客户端上创建 shell 别名或桌面环境快捷方式。)这样您就可以轻松选择不运行 screen、指定备用会话名称等。