![如何检测 shell 是否属于远程 SSH 会话?](https://linux22.com/image/42864/%E5%A6%82%E4%BD%95%E6%A3%80%E6%B5%8B%20shell%20%E6%98%AF%E5%90%A6%E5%B1%9E%E4%BA%8E%E8%BF%9C%E7%A8%8B%20SSH%20%E4%BC%9A%E8%AF%9D%EF%BC%9F.png)
我的问题类似于这个,但我正在寻找稍微不同的东西。我有一台笔记本电脑,我用它在两种不同的场景下访问网络上的 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 主机和no
WAN 主机。这意味着~/.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"