我想配置 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 screen
if来将 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
- 使用名称创建新的屏幕会话默认。