我想配置SSH和屏幕,使登录名始终重新连接到屏幕会话。理想情况下,当我按Cd时,该会话不会退出而是分离。如何做到这一点?还有哪些其他有用的设置可以使我的SSH生活更加轻松?
我想配置SSH和屏幕,使登录名始终重新连接到屏幕会话。理想情况下,当我按Cd时,该会话不会退出而是分离。如何做到这一点?还有哪些其他有用的设置可以使我的SSH生活更加轻松?
Answers:
我对所有服务器都执行了以下操作,因此当我通过SSH连接时,我会自动进入Screen会话。
将以下内容添加到您的用户帐户的〜/ .bashrc中:
# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session. Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ]
then
STARTED_SCREEN=1 ; export STARTED_SCREEN
screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]
如果不存在,则将启动名为main的屏幕会话,如果存在则重新连接至该会话。这样做是因为我有几个其他的屏幕会话正在为各种服务而分离运行,并且不想连接到它们。
我在远程服务器上的.bash_profile中具有以下内容:
if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
reattach() {
if [ -n "${SSH_AUTH_SOCK}" ]; then
ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
fi
exec screen -A -D -RR ${1:+"$@"}
}
screen -wipe
echo 'starting screen... (type Ctrl-C to abort)'
sleep 5 && reattach
fi
这有两件事:首先,设置一个shell函数来替换该shell并继续ssh-agent连接,其次,在暂停几秒钟后(如果您不想启动屏幕),它将调用该函数。
if
如果尚未将屏幕(-z "${STY}"
)连接到终端(-t 0
),并且我没有运行sudo(有时不会更改$USER
),则第一个子句将为true 。
该reattach
函数将首先检查ssh-agent端口为active(-n "${SSH_AUTH_SOCK}"
)时是否调用了ssh 。然后它将~/.ssh/agent-script
用当前活动的套接字文件替换at处的内容,并将环境变量($SSH_AUTH_SOCK
)替换为新值。然后该脚本将用一个screen
会话替换当前的shell (确保仅存在一个会话)。该reattach
函数的所有参数都传递给命令(${1:+"$@"}
)。
最后一部分首先删除所有无效会话(screen -wipe
),让用户(me)知道屏幕即将开始,而可以通过按Ctrl- 返回到外壳C。然后等待5秒钟并调用该reattach
函数。
首先,如果您使用byobu,则可以将新的Shell会话配置为始终自动启动byobu(这实际上是一个不错的屏幕配置,尽管较新的版本可能将tmux用作后端)。如果您确实不希望byobu,则可以通过将您的.profile
或其他shell配置脚本编辑为exec screen
if 来设置屏幕手动连接TERM != "screen"
。
如果您不喜欢这种方式,则可以使用该authorized_keys
文件运行特定命令以使用特定键进行连接(您可以根据需要使用任意数量的键)。有关man sshd
详细信息,请参见。我建议您让该命令运行一个脚本,该脚本检查屏幕是否正在运行并连接,或者开始新的会话。
至于Ctrl-D上的断开连接,屏幕允许您在中设置按键映射.screenrc
。有关man screen
详细信息,请参见。您正在寻找“ bindkey”。
也许与您的问题完全无关,但是您是否曾经考虑过使用TMUX。它提供了许多您想要的开箱即用的功能。
例如。如果您在TMUX之下时从SSH会话断开连接,则所需要做的只是回退并运行“ tmux a”以附加到您的会话。自从我开始使用TMUX以来,我忘记了什么nohup / disown命令……如果您需要运行某些程序并注销,请在tmux中运行它并分离。命令输出将被缓冲,因此您以后可以查看它。
要自动附加,您可以在.bashrc中添加以下内容:
[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a
甚至更容易
tmux a 2>/dev/null
它具有较低的内存占用空间,整体IMHO更好/更易于使用。
meta-d快捷方式是在TMUX中分离的默认映射。