Autossh+launchd 实现全自动 Ssh -D 端口转发 Socks5 代理

用ssh端口转发做为代理 fan qiang 很久了,一直都是手动运行脚本的,我的MBA基本上是不关机的,重来都是用完直接扣下屏幕。 但每次打开之后都需要重新运行一下ssh -D 脚本, 作为一个会写代码的人来说显得还是不够专业。所以我决定要充分发挥我的主观能动性, 让我的电脑更智能。 目前已经可以良好的运行了。

废话少说我直接进入主题。

我的系统是:Mac OS X Lion

首先要介绍几个名词:
ssh端口转发: 是一种利用ssh隧道链接建立的sock5代理。
launchd: Mac OS X 系统下的用来管理整个系统的 services 和 processes 的工具。如果你需要一个程序开机自动运行,或者由于错误停止后自动重新运行,那么就可以用 launchd 来管理。
autossh:是用来保持 ssh 一直处于链接状态的工具。可以在链接断开后自动重新链接。

首先需要设置使用密钥链接 ssh 主机, 这样做的目的是链接主机的时候不用输入密码的环节。
其次你还需要 Homebrew 或者 MacPorts 用来安装 autossh。
我是用 Homebrew 安装的,打开终端。

执行如下命令:
brew install autossh
稍等片刻很快就会完成安装。

终端下输入:
autossh -M 8118 -nNT -D 8117 root@sshhost.com
注意其中 8117是你最终的socks5端口,root是你链接ssh的账号,sshhost.com是你的ssh主机地址(也可以是ip地址)。将这些内容替换成你可以正常使用的信息。
-nNT这个几个参数最好保持,另外最好不要增加-f参数,如果增加了launchd就有可能不能进行正确管理。

执行上面命令之后我们要达到的效果是:没有返回结果,并且命令不结束,socks5可用(可以用 SwitchySharp for Chrome测试)。
这说明autossh ssh -D 已经没有问题。下面我们要做的就是用 launchd 来管理之。
按 Ctrl + c 退出刚才状态。

接下来要用你习惯的文本编辑器创建下面这个文件:
~/Library/LaunchAgents/ssh-d.plist 我是用 Sublime Text 2 创建的。

文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>localdomain.localhost.ssh-d</string>
      <key>ProgramArguments</key>
        <array>
          <string>/usr/local/bin/autossh</string>
          <string>-M</string>
          <string>8118</string>
          <string>-nNT</string>
          <string>-D</string>
          <string>8117</string>
          <string>root@sshhost.com</string>
        </array>
      <key>KeepAlive</key>
        <true/>
      <key>RunAtLoad</key>
        <true/>
      <key>StandardOutPath</key>
        <string>/var/log/ssh-d-out.log</string>
      <key>StandardErrorPath</key>
        <string>/var/log/ssh-d-err.log</string>
    </dict>
  </plist>

打开终端执行命令:
launchctl load ~/Library/LaunchAgents/ssh-d.plist

然后检查 socks 代理是否可以使用。 如果不可以使用,打开 Mac 系统的控制台程序,查看日志有无相关错误。

到目前为止,以后我们就可以很轻松的使用代理了,而且不用操心代理是否链接的问题,系统会自动去帮你检查。

可以使用下面命令查看你的ssh进程情况:
ps -auxww |grep 8117

下面命令是用来去掉launchd进行管理的:
launchctl unload ~/Library/LaunchAgents/ssh-d.plist

参考文章:
自动连接ssh -D的launchd配置
Mac下开机自动连接ssh -D

Comments