如何检测外壳程序何时归远程SSH会话所有?


9

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

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

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

我的主目录可从所有机器通过网络访问,因此它们共享我的副本.bashrc。我想添加功能以.bashrc检测我处于两种情况中的哪一种并采取相应的措施(从技术上讲,将有三种情况,其中第三种是我登录到本地计算机,但是应该易于处理) )。我想做类似的事情:

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

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

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

Answers:


10

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

为了区分本地会话和远程会话,有两种可能的方法:客户端或服务器端。在服务器端,将$SSH_CLIENT其与本地IP地址或路由表进行比较;这通常会告诉您连接是否来自局域网。在客户端,您可能需要将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"

开启局域网,关闭局域网?第二个应该读取WAN-但这是一个单一字符的编辑...
Nils
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.