如何有效地使用 screen 和 SSH?

Tob*_*ler 12 ssh gnu-screen

我想配置 SSH 和屏幕,以便登录将始终重新附加到屏幕会话。理想情况下,当我按下 Cd 时,该会话不会退出而是分离。如何做到这一点?还有哪些其他有用的设置可以让我的 SSH 生活更轻松?

dae*_*aos 9

我只是对我的所有服务器执行了以下操作,因此当我通过 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]
Run Code Online (Sandbox Code Playgroud)

如果它不存在,这将启动一个名为 main 的屏幕会话,如果存在则重新连接到它。这样做是因为我有几个其他屏幕会话正在为各种服务分离运行,并且不想连接到它们。


Arc*_*ege 8

我的远程服务器上的 .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
Run Code Online (Sandbox Code Playgroud)

这做了两件事:首先,设置一个 shell 函数来替换 shell 并进行 ssh-agent 连接,其次它在暂停几秒钟后调用该函数(以防您不希望 screen 启动)。

if如果尚未运行 screen ( -z "${STY}") 附加到终端 ( -t 0) 并且我没有运行 sudo (有时不会更改$USER),则第一个子句将为真。

reattach函数将首先检查 ssh 是否在 ssh-agent 端口处于活动状态 ( -n "${SSH_AUTH_SOCK}") 的情况下被调用。然后它将~/.ssh/agent-script用当前活动的套接字文件替换任何内容,并$SSH_AUTH_SOCK用新值替换环境变量 ( )。然后脚本将用一个screen会话替换当前的 shell (确保只存在一个会话)。reattach函数的任何参数都传递给命令 ( ${1:+"$@"})。

最后一部分首先删除所有死会话 ( screen -wipe),让用户 (我) 知道屏幕将很快启动,并且可以通过按Ctrl-返回到外壳程序C。然后它等待 5 秒钟并调用该reattach函数。