![检测共享 ssh 会话](https://linux22.com/image/120392/%E6%A3%80%E6%B5%8B%E5%85%B1%E4%BA%AB%20ssh%20%E4%BC%9A%E8%AF%9D.png)
在我的工作中,我必须通过 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}"; }