使用 expect 防止 sshgfw 代理断线

来源:隐清堂

自从用了 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 来穿墙啦。

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


没有评论: