• 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 $@
    }
    
    

    使用效果:

  • 相关阅读:
    c程序实验报告
    C程序设计实验报告
    第六章 实验报告(函数与宏定义)
    熊承启第五章循环结构实验
    循环结构课后反思
    c语言实验报告
    c语言设计实验报告
    第九章 结构体与共用体
    第八章 指针实验
    数组实验
  • 原文地址:https://www.cnblogs.com/cnhack/p/15951249.html
Copyright © 2020-2023  润新知