Shadowsocks 是一个人见人爱花见花开的加密 Sock5 代理,本朝翻越运动员都很喜欢它。 Shadowsocks 在 Mac 上有好几个好用的客户端,其中 shadowsocks-go 是一个命令行版客户端,最适合自动化。 这篇文章介绍如何使用 Mac 上的 launchd 自动启动 Shadowsocks 代理。
Shadowsocks
shadowsocks-go 在 Shadowsocks 官网 上的下载链接失效了(20150518),
可以在它的 Github 页面找到下载链接,或者直接 clone 项目进行编译。
这个客户端的使用非常简单,参数直观,我建议使用 -c=configuration.json
参数来启动,
其中 configuration.json 是配置文件,例如下面的配置:
{
"server":"123.456.789.10",
"server_port":8080,
"local_address": "127.0.0.1",
"local_port":7070,
"password":"password",
"timeout":300,
"method":"aes-256-cfb",
"fast_open":false
}
启动命令如下:
/path/to/shadowsocks -c=configuration.json
默认情况下 Shadowsocks 在命令行启动后,会常驻前台,并没有 daemonize。 为了方便使用,我使用了 launchd 管理 Shadowsocks 服务,并且可以随系统自动启动。
launchd
launchd 是一个开源项目,是 Mac OS 下常用的守护进程管理器。 launchd 使用一个 XML 文件定义一个守护进程,这个文件非常好写, 详细的参数配置可以参考 launchd.info 这个教程,这里先给出我的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.shadowsocks.dp</string>
<key>WorkingDirectory</key>
<string>/Users/gnailuy/bin/</string>
<key>Program</key>
<string>shadowsocks</string>
<key>ProgramArguments</key>
<array>
<string>shadowsocks</string>
<string>-c=configuration.json</string>
</array>
<key>StandardOutPath</key>
<string>logs/shadowsocks.stdout</string>
<key>StandardErrorPath</key>
<string>logs/shadowsocks.stderr</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
这个配置非常清晰,我将 shadowsocks 可执行文件放在了 /Users/gnailuy/bin/
目录下,
配置文件 configuration.json 也放在了同一目录下。
配置中的 Program
属性是冗余的,由于指定了这个属性,
ProgramArguments
的第一个属性值 shadowsocks
实质上变成了进程环境的 argv[0]
。
将这个配置文件保存为 ~/Library/LaunchAgents/org.shadowsocks.dp.plist
,
然后使用下面命令加载:
launchctl load ~/Library/LaunchAgents/org.shadowsocks.dp.plist
由于配置了 RunAtLoad
参数,所以加载后 Shadowsocks 就会运行。
可以在配置文件里指定的 shadowsocks.stdout
和 shadowsocks.stderr
里看到运行日志。
如果想要停止服务,只需要 'unload' 这个配置即可:
launchctl unload ~/Library/LaunchAgents/org.shadowsocks.dp.plist