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


17

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

Answers:


20

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别名或桌面环境快捷方式。)这样,您可以轻松选择不运行屏幕,指定备用会话名称等。


完善。应该在手册页中。
marcusw

ssh运行screen -D -R甚至更好screen -D -RR吗?
niutech '16

2

您的X服务器启动脚本通常会启动新的外壳程序,例如,如果您要通过“用户定义的会话”使用gdm登录。

我认为任何不退出的操作都可能导致X启动挂起。那将包括screen -r


X服务器启动脚本将无法运行.bashrc。但是在其他情况下这可能会成为问题,例如在运行时ssh host.example.com somecommand(奇怪的是,bash确实会运行.bashrc)。
吉尔(Gilles)“所以,别再邪恶了”,2010年

如果您选择“用户定义的会话”,它将在某些发行版中。在Ubuntu上,它显式地获取.profile,其他人从登录外壳内部调用.xsession,这通常意味着.bash_profile,大多数用户从其.bash_profile内部获取.bashrc。
Mikel 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.