检测共享 ssh 会话

检测共享 ssh 会话

在我的工作中,我必须通过 ssh 连接到大量不同的机器。为了让我的生活更轻松,我一直在尝试自动设置每台机器的配色方案,以便我一眼就能看出我正在处理哪一台机器。

这是几乎在职的。

〜/ .ssh /配置:

Host some-remote-server
    Hostname some-remote-server.ac.uk
    User myusername
    IdentityFile ~/.ssh/id_rsa
    ForwardAgent yes
    ForwardX11 yes

Host some-other-remote-server
    Hostname some-other-remote-server.ac.uk
    User myusername
    IdentityFile ~/.ssh/id_rsa
    ForwardAgent yes
    ForwardX11 yes
    ProxyCommand ssh -Y some-remote-server -W %h:%p
    ControlMaster auto
    ControlPath /tmp/ssh-socket-%r@%h-%p
    ControlPersist 600

假设我希望“some-remote-server”和“some-other-remote-server”都为蓝色,而我希望“my-local-server”为红色。

登录没问题; “~/.profile”中有一些代码可以适当地设置颜色方案。然而,注销是有问题的。

〜/ .bash_logout:

if [[ $- == *i* ]]; then
  ORIGIN_HOST=`who am i | awk -F"[()]" '{print $2}'`
  $HOME/bin/set_the_colorscheme $ORIGIN_HOST
fi

当我退出从 my-local-server 到 some-other-remote-server 的 ssh 会话时,上面的脚本将 $ORIGIN_HOST 标识为“some-remote-server”(我的 SSH 配置文件中的 ControlMaster 设置的 b/c)并且所以颜色保持蓝色。

有没有办法检测我正在使用 ControlMaster 并找到发出原始 ssh 命令的主机?

谢谢。

答案1

听起来您的真正目标是在终止 SSH 会话后恢复终端设置。这是一种与您之前的解决方案略有不同的解决方案。这是基于其他帖子的解决方案:

您可以定义一个包装器/垫片函数来在 SSH 会话终止后执行一些代码:

function ssh () { command ssh "$@"; echo "SSH session terminated!"; }

使用此包装器,您可以根据当前主机重置终端环境。特别是,您可以执行以下操作:

$ mkdir -p ~/.ssh/exit_scripts

$ cat <<HEREDOC > "${HOME}/.ssh/exit_scripts/${HOSTNAME}"
# Host-specific script goes here
echo "I'm on $(hostname)"
HEREDOC

$ function ssh () { command ssh "$@"; source "${HOME}/.ssh/exit_scripts/${HOSTNAME}"; }

相关内容