0、说明
因为之前使用ssh做代理服务器,又使用了autossh来检测ssh连接状态,使得连接断开自动重连。但是经过一段时间测试使用,发现代理服务器经常不能使用。发现autossh自动重连的时候需要手动输入下密码。这样就失去了自动重连了意义,连接断开时等于没有自动恢复。
网上查发现可以使用expect来为autossh自动输入命名,经过一段时间研究测试成功解决以上遇到的问题。这里记录下。
1、安装expect
1 2 3 4 5 |
[root@imzcy ~]#rpm -ivh tcl-8.5.7-6.el6.x86_64.rpm \ expect-5.44.1.15-5.el6_4.x86_64.rpm [root@imzcy ~]# which expect /usr/bin/expect [root@imzcy ~]# |
rpm包下载地址: 密码: i4ec 经测试在centos 7.4 x64上使用正常
2、测试脚本及说明
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@gsm script]# cat test.sh #!/usr/bin/expect set timeout -1 spawn autossh -M 37202 -CNnqg -D 1080 -p 37202 root@127.0.0.1 expect { "root@127.0.0.1's password:*" { send "sz_123\r"; exp_continue } } [root@gsm script]# [root@gsm script]# chmod u+x test.sh [root@gsm script]# ./test.sh |
set timeout :定义timeout的时间为-1(永不超时),也可以输入正常数值例如100(如果脚本命令都执行正常情况下,等待多少秒后退出脚本)
spawn :后面跟具体要执行的命令
expect :定义字符内容用于匹配上面spawn后面执行命令的返回内容
send :如果spawn后面运行命令的返回内容,匹配expect上面定义的。就发送send定义的内容到上面(相当于输入了密码)。
; exp_continue :处于expect代码段内,表示重新回到expect开始出执行命令。这样就会一直循环下去,当autossh断开重连的时候会重新提示输入密码,expect匹配到后会自动输入密码。