如何有效使用screen和SSH?

如何有效使用screen和SSH?

我想配置 SSH 和 screen,以便登录始终重新连接到 screen 会话。理想情况下,当我按 Cd 时,该会话不会退出而是分离。如何才能实现这一目标?还有哪些其他有用的设置可以让我的 SSH 生活更轻松?

答案1

我刚刚对所有服务器执行了以下操作,以便当我通过 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 的屏幕会话(如果它不存在)或重新连接到它(如果存在)。这样做是因为我有几个其他屏幕会话正在为各种服务分离运行,并且不想连接到它们。

答案2

我的远程服务器上的 .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 连接,其次,它会在暂停几秒钟后调用该函数(以防您不希望屏幕启动)。

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

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

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

答案3

首先,如果您使用 byobu,您可以配置一个新的 shell 会话以始终自动启动 byobu(这本质上是一个很好的屏幕配置,尽管较新的版本可能使用 tmux 作为后端)。如果您确实不想要 byobu,那么您可以通过将您的.profile或其他 shell 配置脚本编辑为exec screenif来将 screen 设置为手动连接TERM != "screen"

如果您不喜欢这样,您可以使用该authorized_keys文件运行特定命令以与特定密钥进行连接(并且您可以拥有任意数量的密钥)。man sshd详情请参阅。我建议您让命令运行一个脚本来检查屏幕是否正在运行并连接,否则启动一个新会话。

至于按 Ctrl-D 断开连接,屏幕允许您在.screenrc.man screen详情请参阅。您正在寻找“bindkey”。

答案4

screen -dAr default || screen -AS default对我有用。我将其添加到我的~/.bashrc

简单解释一下开关:

  • d- 如果屏幕仍连接到另一个会话,则将其与另一个会话分离。
  • A- 使屏幕中的窗口适应新的终端尺寸。
  • r default- 附加到称为默认的屏幕。

如果第一个屏幕命令(之前的那个||)不成功,则运行第二个屏幕命令:

  • A- 如上所述...
  • S default- 使用名称创建新的屏幕会话默认

相关内容