如何检测 shell 是否属于远程 SSH 会话?

如何检测 shell 是否属于远程 SSH 会话?

我的问题类似于这个,但我正在寻找稍微不同的东西。我有一台笔记本电脑,我用它在两种不同的场景下访问网络上的 Linux 机器:

  • 我与网络有直接的有线连接。

  • 我与网络有间接连接。网络上有一台暴露在互联网上的网关机器,我可以用它来建立到网络上主机的 SSH 隧道。这显然是一个更慢、延迟更高的连接。

我的主目录可从所有计算机进行网络访问,因此它们共享我的.bashrc.我想添加功能来.bashrc检测我所处的两种场景中的哪一种并采取相应的行动(从技术上讲,会有三种场景,其中第三种是我正在登录到本地计算机,但这应该很容易处理)。我想做这样的事情:

  • alias ssh ssh -X当我在本地网络上,但我不想通过互联网使用 X 转发时。

  • export EDITOR=gvim当我在本地网络上时,但是export EDITOR=vim当我在远程时。

等等。根据前面的答案,看起来我应该能够通过检查内容SSH_CLIENT(如果存在)并查看客户端 IP 地址是否与本地计算机上的网络适配器之一匹配来完成类似的操作。我想我会看看是否有一种更灵活或更强大的方法来完成此任务。

答案1

要检测 SSH 会话,请使用$SSH_CLIENT.

为了区分本地和远程会话,有两种可能的方法:客户端或服务器端。在服务器端,$SSH_CLIENT与本地IP地址或路由表进行比较;这通常会告诉您连接是否来自 LAN。在客户端,您可能需要将ForwardX11设置放入~/.ssh/config:将其设置yes为 LAN 主机和noWAN 主机。这意味着~/.ssh/config不同的网站有不同的内容;这就是我所做的,我用 shell 脚本生成我的。

如果 LAN 连接的 X11 转发处于打开状态,而 WAN 连接的 X11 转发处于关闭状态,那么您可以设置您最喜爱的编辑器以将其考虑$DISPLAY在内。

服务器端设置通常会进入您的.profile(或者.bash_profile如果您的登录 shell 是 bash 并且您使用.bash_profile,或者.zprofile如果您的登录 shell 是 zsh)。

case ${SSH_CLIENT%% *}//$(/sbin/ifconfig |
                          sed -n 's/^.* addr:\([0-9][0-9.]*\) .*/\1/p' |
                          tr '\n' /)/ in
  "") :;;# local session
  10.42.*/10.42.*) :;; # LAN session
  1.2.3.*/1.2.3.*) :;; # LAN session
  *) unset DISPLAY;; # WAN session
esac
export EDITOR=vim
if [ -n "$DISPLAY" ] && type gvim >/dev/null 2>/dev/null; then
  EDITOR=gvim
fi
export VISUAL="$EDITOR"

相关内容