对我来说,ssh tunnel就是用来那啥的。ssh连接有个最大问题就是没有断线重连机制,在win下面有以myentunnel为代表的软件来看着它所调用plink.exe来建立的ssh连接是否正常,断线就重新调用一下。

Linux也有类似的东西,Gnome下面有个Gnome SHH Tunnel Manager,简称gstm的能实现,缺点是密码不能保存,每次都要自己输入,且依赖图形界面。KDE下面也有一个,名字很有喜感,叫kstm,就是KDE SSH Tunnel Manager,另外还有一个,忘名字了,暂时找不到,但是遗憾的是没有Xfce SSH Tunnel Manager这个神物。

上网一搜,有类似的方案,主要都是来源于这篇文章,对我来说这个方案并不能完全满足我的需求,第一我不想在桌面上专门开个终端(因为expect是需要与屏幕显示交互的,因此不能后台运行),第二他只是发送字符防止超时断开连接,强壮性不够,下面是改进过的脚本。

01 #!/usr/bin/expect
02
03 set timeout 60
04
05 while (1) {
06 spawn /usr/bin/ssh -D 7070 -g ****@*****.****
07 expect {
08 “*(yes/no)?” {
09 send “yes\r\n”
10 expect “*password:” send “****\r\n”
11 }
12 “*password:” {
13 send “****\r\n”
14 }
15 }
16 interact { timeout send “\r\n” }
17 wait
18 }

一是加了第一次登录时确认密钥的步骤,二是用while和wait来实现这条ssh连接结束后,能重新再连接一次,除非脚本进程被干掉,不然不管是在终端里面输入了exit还是kill掉该进程都是能原地满血满状态复活的。

chmod +x这个脚本文件,然后Ctrl+Alt+F1切换到字符界面,Alt+F2打开个新终端,执行这个脚本,再Alt+F7切回来,然后就ok了,灰常的好。

最后,这个做法对于被设置了不允许运行shell的帐号应该是不行。

======================================

最近更新,以上都是废话,用autossh就好了,完毕。