背景
与Ubuntu的upstart类似,Mac OS上提供了launchd作为后台服务的管理程序。ssh -D命令可以为用户提供sock5代理,但是每次访问网络之前,都要打开Terminal手动运行ssh命令是一件很烦的事情。加上网络条件不好,ssh频繁退出,就更烦了。Linux下有autossh+upstart/init可以选择,Mac OS下就需要借助launchd了
配置Mac到远程ssh服务器的自动登录
为了将ssh -D变成launchd管理的后台服务,配置ssh自动登录是必须的。Mac下过程与Linux不太一样,首先打开Terminal,生成用户ssh证书:
sudo su ssh-keygen cat /var/root/.ssh/id_rsa.pub |
然后把公钥上传到ssh服务器。注意:Mac OS下root的HOME被设置在了/var/root下。
ssh EXAMPLE.COM mkdir .ssh scp id_rsa.pub EXAMPLE.com:.ssh/authorized_keys # 测试公钥认证是否成功 ssh -o BatchMode=yes EXAMPLE.COM |
生成launchd格式的plist文件
将下述ssh-d.plist文件放在/Library/LaunchDaemon/目录下:
<?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/bin/ssh</string> <string>-o</string> <string>BatchMode=yes</string> <string>-o</string> <string>CheckHostIP=no</string> <string>-o</string> <string>StrictHostKeyChecking=no</string> <string>-D</string> <string>1080</string> <string>-i</string> <string>/var/root/.ssh/id_rsa</string> <string>-vvvNnT</string> <string>root@EXAMPLE.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> |
然后运行下面的命令后台启动ssh -D:
launchctl load /Library/LaunchDaemon/ssh-d.plist |
如果出错需要调试,ssh进程的标准输出和标准错误输出保存在/var/log目录下的ssh-d-out.log和ssh-d-err.log文件中。如果一切正常,则配置完毕,以后Mac启动后,ssh -D进程会自动启动,ssh退出后,launchd也会自动生成一个新的进程。
与autossh集成
如果通过fink和MacPorts或者其他方法安装了autossh,可以修改上述脚本中的ssh程序的路径为autossh的路径。并将autossh的参数按格式加入plist文件,这样,也能享受到autossh提供的隧道假死后自动重启功能。