如何有效使用屏幕和SSH?


12

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

Answers:


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]

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


我只是想补充一下,CTRL-d组合键是屏幕上的标准配置,可与运行中的屏幕会话分离。
混沌守护进程

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

这有两件事:首先,设置一个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函数。


4

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

如果您不喜欢这种方式,则可以使用该authorized_keys文件运行特定命令以使用特定键进行连接(您可以根据需要使用任意数量的键)。有关man sshd详细信息,请参见。我建议您让该命令运行一个脚本,该脚本检查屏幕是否正在运行并连接,或者开始新的会话。

至于Ctrl-D上的断开连接,屏幕允许您在中设置按键映射.screenrc。有关man screen详细信息,请参见。您正在寻找“ bindkey”。


2

也许与您的问题完全无关,但是您是否曾经考虑过使用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中分离的默认映射。


0

screen -dAr default || screen -AS default为我工作。我将其添加到我的〜/ .bashrc中

简要说明这些开关:

  • d -如果仍然连接屏幕,请从另一个会话中分离屏幕。
  • A -使屏幕上的窗口适应新的终端尺寸。
  • r default -附加到默认屏幕。

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

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

0

我建议使用byobu。该工具使用tmux,并提供了不错的工具栏以及其他方便的窗口切换功能,热键等。

echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc

在成功的SSH登录后,使用上述这些命令尝试使用系统并连接到现有的byobu-tmux会话,否则将创建一个新会话。

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.