Cygwin/WSL专用:ssh命令劫持同名函数,判断是否通过跳板机、代理连接Linux服务器,并给出提出信息;


由于连接国外服务器/VPS时候,经常在SSH客户端配置文件(~/.ssh/config)中配置各种网络代理和跳板机,在命令行界面连接目标服务器时,有时无法准确快捷判断是目标服务器挂了,还是使用了错误的代理,又或者代理挂了,故写此hook函数,在Cygwin、WSL窗口中只需按原使用习惯操作命令即可,函数会通过读取配置文件判断以后给出温馨提示!

#======================================================
###测试:以下代码块尝试覆盖一些基础程序,做一些判断和其他操作
#======================================================
#覆盖SSH基础配置,可以做一些判断操作,例如,连接国外服务器自动使用代理,连国内服务器不使用等等
#在命令行交互界面可以 unset ssh 反定义,卸载本函数
#单次执行时临时禁用本函数可以使用双反斜杠转义,如:\\ssh open,也可以直接使用大写的SSH避开调用本函数
#使用ssh作为管道的时候,注意屏蔽此函数,否则会导致终端输出的文本附加到文件中,比如以下命令会出问题。
#ssh open 'dd if=/usr/sbin/trojan-go'|ssh suse 'dd of=/root/trojan-go'
ssh() {
	#匹配到可能使用管道符的情况则直接调用ssh程序,不做任何处理
	if [ $# -eq 2 ] && ([[ "$2" =~ "tar " || "$2" =~ "dd " || "$2" =~ "cat " || "$2" =~ "7za " || "$2" =~ "gzip " || "$2" =~ "xz " || "$2" =~ "zip " || "$2" =~ "rar " || "$2" =~ "curl " ]]);then
		/usr/bin/ssh $@
		return
	fi
	local SCRIPTPATH="/v/bin/aliaswinapp"
	print_color 33 "$SCRIPTPATH"
	print_color 33 "SSH程序被自定义功能覆盖..."
	if [ $# -eq 1 ];then ##只有一个参数时,进行后续判断,是否通过代理连接等...
		ProxyFind=`sshfind $1|grep -iE '[^#]ProxyCommand' 2>/dev/null`
		if [ $? -eq 0 ];then
			print_color "Notice:当前正通过代理中继连接到服务器..."
			echo -e "$(echo $ProxyFind|sed -r 's/^[\s\t]//g')"
			if [[ "$ProxyFind" =~ " ssh " ]];then
				#如果是跳板机格式,则直接连接不进行网络通畅性检测
				print_color "Notice:通过跳板机连接..."
				/usr/bin/ssh $@
				return
			fi
			##检测代理的出口IP地址
			if [[ "$ProxyFind" =~ "nc -X 5" || "$ProxyFind" =~ "connect-proxy -S" ]];then
				local proxyType="socks5://"
			else
				local proxyType="http://"
			fi
			#awk里面正则表达式不要乱加ig标识符,会要命
			local proxyServer=$(echo $ProxyFind|awk -F '' '{gsub(/^[ \t\r\n]*/,"",$0);r=match($0,/(([0-9]{1,3}\.){3}[0-9]{1,3}[:][0-9]{2,5})/,arr);print arr[1]}')
			#echo $ProxyFind|awk -F '' '{gsub(/^[ \t\r\n]*/,"",$0);print $0;r=match($0,/(([0-9]{1,3}\.){3}[0-9]{3}[:][0-9]{2,5})/,arr);print "Return: "r;print "Rstart & RLENGTH:" RSTART" " RLENGTH;print arr[1];for(i in arr){print "subscript:"i"\t""valus:"arr[i]}}'
			#echo -e "$proxyServer"
			curl -sS -m 1 --connect-timeout 1 -x ${proxyType}${proxyServer} http://v.ynit.top/ipfull/
			if [ $? -ne 0 ];then
				print_color 9 "代理检测失败,中断后续连接..."
				return
			fi
			echo -e "\n\c"
		fi
	fi
	##以下使用可执行程序绝对路径调用,否则会陷入无限循环调用函数本身
	/usr/bin/ssh $@
}

使用效果: