如何检测远程 SSH 会话何时拥有 shell?

Jas*_*n R 9 shell ssh bashrc

我的问题与类似,但我正在寻找稍微不同的问题。我有一台笔记本电脑,用于在两种不同的情况下访问网络上的 Linux 机器:

  • 我有一个直接的有线连接到网络。

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

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

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

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

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

Gil*_*il' 10

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

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

如果 X11 转发对于 LAN 连接是打开的,对于 WAN 连接是关闭的,那么您可以设置您喜欢的编辑器以将$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"
Run Code Online (Sandbox Code Playgroud)