公司的服务器设置了防火墙,要通过socks才能连接到ssh服务器。
windows下的很多ssh客户端,比方putty,等都内置了socks功能,设置一下就可以了。但我用的是linux,要找个linux下的解决方案。

搜索了一下,找到一个 dante 。

官方网站:

opensuse的源上就有,安装很简单,下面是我的配置过程。

编辑/etc/socks.conf文件,在最后添加:

 

route {
       from: 0.0.0.0/0   to: 0.0.0.0/0   via: yoursocksserver port = socksserverport
       protocol: tcp udp
       proxyprotocol: socks_v4 socks_v5
       method: username
}

把yoursocksserver替换成你的socks服务器ip,socksserverport替换成你的socks服务器端口。method指socks的认证方式。如果不需要认证就改成none。

如果是通过用户名验证的,则需要设置一个环境变量:

 

export SOCKS_USERNAME=yoursocksusername

 

 这个变量就是你的socks服务器的用户名。dante会通过这个环境变量来获取socks用户名。如果没有设置就用当前用户。

然后用socksify脚本来执行需要使用socks的程序,在这里是ssh。

 

socksify ssh root@yoursshserverip

 

执行后可以看到,先要求你输入socks服务器的密码,输入正确之后,再提示你输入ssh服务器的密码。如果没有成功,你可以修改socks.conf文件,激活下面这两个选项:

 

#debug: 1           # uncomment to enable debugging

#logoutput: stdout  # users usually don't want to be bothered with that.

 

看报什么错误。

查看一下socksify脚本,可以看到它做的事情很简单,就是在执行ssh前先加载libdsocks.so库。

至此,目的虽然达到了,但还有个问题就是每次登录服务器都需要输入两次密码,太麻烦,能不能让它自动化?

我又找到一个很有用的工具expect(如果不存在这个命令请先从源上安装)。这个工具是专门来让这样的交互式程序自动化的。
写一个脚本:

#!/usr/bin/expect
set sockspasswd "yoursockspassword"
set sshpasswd "yoursshpassword"
spawn socksify ssh root@yoursshserverip "[lindex $argv 0]";
expect "*password:";
send "$sockspasswdr";
expect "*password:";
send "$sshpasswdr";
interact;

 

保存后执行它,是不是自动登录到你的ssh服务器上了?

其实还不需要手动写这个脚本,expect有个工具,叫autoexpect,可以帮你自动生成这个脚本。
直接运行 

autoexpect -f autologinserver socksify ssh root@yoursshserverip

按步骤完成输入,登录后退出。autoexpect就会录制下你的输入,给你生成一个名叫autologinserver(-f 参数指定)的文件。

运行它,是不是自动登录了?当然这个文件还需要修改下,因为它会把你登录后的ssh输出的内容也给记录下。

最后,这个问题算圆满解决了。

expect的功能很强大,这里只是它最简单的一个应用而已,详细的请参看man手册或者官方网站。
dante也可以做socks服务端,这里就不介绍了,具体参看官方网站。

享受生活,享受linux。