使用 expect 防止 sshgfw 代理断线

July 15, 2009
Tags: ,

自从用了 ssh -D 代理后(可参考本 blog 右边的链接),便再也不用为点击某个链接被重置的情况烦恼啦。我在 Linux 使用 ssh -D 连接代理服务器时过一段时间总会断线,于是我就用 expect 写了一个脚本,不担可以防上 ssh 断线,还可以自动输入密码 :-)

关于 expect 我摘录一段在 中文维基 上的介绍:

ExpectUnix系统中用来进行自动化控制和测试的软件工具,由Don Libes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnetftpPasswdfsckrlogintipssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制

有些 linux 系统里可能没有 expect , 你可以自己安装

在 debian/ubuntu 里 : apt-get install expect
在 opensuse 里:zypper in expect
在 fedora 里: yum install expect
当然还有一些其它发行版都有自己的安装方式。

你可以新建一个文件,比如 sshgfw , 将如下代码复制进去。
#!/usr/bin/expect
set timeout 60

spawn /usr/bin/ssh -D 7070 -g user@yourserver.com
# 这里的 user 为你自己的用户名,yourserver.com  为你自己的服务器域名或 ip
expect {
"password:" {
send "password\r"
#这里的 password 改为你自己的密码
}
}
interact {
timeout 60 { send " "}
}

加上可执行权限 chmod a+x sshgfw, 然后你就可以在它所在的目录 ./sshgfw 执行就行了。当然你也可以把它复制到 /usr/local/bin 或 /usr/bin 等目录下,以方便本机所有用户都可以快捷的使用。

注:ssh 加上 -g (即在代码中的 ssh -D  7070  -g ) 可使局域网内其它机器使用我的机器做代理. 以我的情况为例:我在一个局域网内的 ip 为 192.168.1.16 , 当我联上服务器之后,我就可以使用 localhost:7070 做代理,同时我的局域网内的其它 ip 为 192.168.1.* 的机器,就可以用代理 192.168.1.16:7070 来穿墙啦。

当然如果你还有什么不了解,欢迎给我留言。我会尽量帮忙。 :-)

14 Responses to “使用 expect 防止 sshgfw 代理断线”

  1. 原来真是会断线,怪不得,我要拼命重新登录输入密码~~
    我wine了,myentunel效果还不错,显然script更好用!
    谢谢!!

  2. 在 expect 前最好加上一个 match_max 吧。

  3. 请问这个要想在Mac OS下用, 该怎样做?
    谢谢

  4. @Hinc
    嗯,谢谢!:-)

  5. @William

    我没有 Mac, 所以我也不太清楚。但是如果用 Mac OS 的话应该也可以照样用吧。我不清楚 Mac 里有没有 expect ,如果没有用 Macports 应该可以很容易的装上。

  6. 你好。可否提供個SSH帳號給我。。由於在被牆包圍的地方裡,我不能做這文章的轉載,但我會用其它方式告知別人的。。謝謝。。。

  7. @gfwgo2hell
    已发你 Email

  8. @admin
    郵件已收到,謝謝你的分享。

  9. 用autossh跑成daemon最佳

    autossh

    http://www.harding.motd.ca/autossh/

  10. 你好,能否帮忙申请一个ssh帐号,我现在用的VPN,时常不稳定。请原谅不能转发

    您的文章,我会采取其他方式做的,谢谢!

  11. archlinux下使用免费Ultravpn代理

    windows下Ultravpn的使用非常简单,去http://ultravpn.fr/下载一个ultravpn-install.exe文件安装,然后http://ultravpn.fr/account.htm申请一个免费的帐号登录连接就可以了。我使用的是Archlinux,虽然linux下使用Ultravpn的介绍文章很多(如使用openvpn+networkmanager等),但照着做下去,总有各式各样的问题。好不容易找到一个英文的介绍文档,做下去终于成功。下面将方法详细翻译过来,以方便大家特别是新手安装。该方法应该也适用于其他的linux发行版,关键要搞清楚配置文件的路径。

    1、申请帐号:和windows下一样,首先去http://ultravpn.fr/account.htm申请一个免费的帐号。

    2、安装openvpn:对Archlinux,使用yaourt 安装执行:yaourt openvpn 或者root权限执行:pacman -S openvpn 命令即可,目前的版本是openvpn-2.1_rc19-4 。其他发行版请采用适当的命令安装,如Fedora用sudo yum install openvpn。安装完成后,配置文件在/etc/openvpn目录下,其他发行版请注意相应的配置文件的安装路径。

    3、创建连接配置文件和证书文件:我们采用借用windows下配置文件和证书文件的方法。去http://ultravpn.fr/下载一个ultravpn-install.exe文件安装到一台windows XP的机器上,windows下默认的安装路径是 c:\Program Files\UltraVPN,如果您找不到可用的windows机器,也可以采用linux下的wine模拟安装,命令为:wine ultravpn-install.exe(请先安装wine!)。一般的安装目录在~/.wine/drive_c/Program\ Files/UltraVPN/。

    4、拷贝windows下的配置文件于linux下使用:将windows机器上安装路径 c:\Program Files\UltraVPN\config目录中的client.ovpn和ca.crt两个文件拷贝到archlinux的/etc/openvpn/目录,并且重命名为 UltraVPN.conf 和 UltraVPN.crt。

    5、编辑配置文件:用文本编辑器打开UltraVPN.conf ,将其中的”cert ca.crt” 一行改为”ca /etc/openvpn/UltraVPN.crt”,并且在该行的下一行加上一行:route xxx.xxx.xxx.xxx 255.255.255.255 net_gateway。把这里的 xxx.xxx.xxx.xxx 替换
    为你当地的DNS地址,如 202.61.95.35 。

    6、连接代理服务器:打开终端,以root权限执行命令:openvpn /etc/openvpn/UltraVPN.conf ,即可以出现登录画面。

    输入你申请到的用户名和密码即可,如下所示:
    ___________________________________________________________________________________
    [root@MYNEW wpp]# openvpn /etc/openvpn/UltraVPN.conf
    Fri Oct 9 05:21:38 2009 OpenVPN 2.1_rc19 i686-pc-linux-gnu [SSL] [LZO2] [EPOLL] built on Sep 22 2009
    Enter Auth Username:*********用户名
    Enter Auth Password:*********密码
    ______________________________________________________________________________
    连接时间视网络状况而定,连接成功后的画面如下(出现 nitialization Sequence Completed 字样):
    _______________________________________________________________________________
    Fri Oct 9 05:45:11 2009 OPTIONS IMPORT: timers and/or timeouts modified
    Fri Oct 9 05:45:11 2009 OPTIONS IMPORT: –ifconfig/up options modified
    Fri Oct 9 05:45:11 2009 OPTIONS IMPORT: route options modified
    Fri Oct 9 05:45:11 2009 OPTIONS IMPORT: –ip-win32 and/or –dhcp-option options modified
    Fri Oct 9 05:45:11 2009 ROUTE default_gateway=192.168.1.1
    Fri Oct 9 05:45:11 2009 TUN/TAP device tun0 opened
    Fri Oct 9 05:45:11 2009 TUN/TAP TX queue length set to 100
    Fri Oct 9 05:45:11 2009 /sbin/ifconfig tun0 10.8.181.186 pointopoint 10.8.181.185 mtu 1500
    Fri Oct 9 05:45:11 2009 /sbin/route add -net 87.98.173.225 netmask 255.255.255.255 gw 192.168.1.1
    Fri Oct 9 05:45:11 2009 /sbin/route add -net 0.0.0.0 netmask 128.0.0.0 gw 10.8.181.185
    Fri Oct 9 05:45:11 2009 /sbin/route add -net 128.0.0.0 netmask 128.0.0.0 gw 10.8.181.185
    Fri Oct 9 05:45:11 2009 /sbin/route add -net xxx.xxx.xxx.xxx netmask 255.255.255.255 gw 192.168.1.1
    Fri Oct 9 05:45:11 2009 /sbin/route add -net 10.8.0.1 netmask 255.255.255.255 gw 10.8.181.185
    Fri Oct 9 05:45:11 2009 Initialization Sequence Completed
    ______________________________________________________________________________

    7、如果不希望每次都输入用户名和密码,则可以在上述配置文件的同一目录下建立一个名为UltraVPN.pw的文件,文件只有两行,第一行为用户名,第二行为密码。修改配置文件UltraVPN.conf 的最后一行“auth-user-pass“
    为:auth-user-pass /etc/openvpn/UltraVPN.pw 即可。

    下面是我的配置文件UltraVPN.conf 内容,供参考。

    client

    dev tun

    proto udp

    hand-window 15

    remote-random

    remote servers443.ultravpn.fr 443

    remote servers24.ultravpn.fr 24

    remote servers21.ultravpn.fr 21

    remote servers54.ultravpn.fr 54

    remote servers24.ultravpn.net 24

    remote servers443.ultravpn.net 443

    resolv-retry infinite

    nobind

    # Try to preserve some state across restarts.

    persist-key

    persist-tun

    ca /etc/openvpn/UltraVPN.crt

    route 3.4.5.6 255.255.255.255 net_gateway

    # Enable compression on the VPN link.

    # Don’t enable this unless it is also

    # enabled in the server config file.

    comp-lzo

    # Set log file verbosity.

    verb 3

    auth-user-pass /etc/openvpn/UltraVPN.pw

  12. windows的软件越来越匮乏了,看来不得不去学Linux了。

  13. 哈哈,谢谢啦,解决了我两个大麻烦。

  14. 感谢楼主,今天刚好用上。

Leave a Reply