Appearance
autossh 详细说明
这是一份详细说明版,适合后续回看,主要解释每一步为什么这么做,以及当前配置是否需要调整。
1. 本次需求的本质
本次配置的目标不是让远端机器监听 1080 端口,而是:
- 通过 SSH 登录到
100.x.x.x - 在本机开启一个 SOCKS5 代理
- 本地代理端口为
1080 - 让连接尽量稳定
- 让它能后台运行并开机自启
最终本机可用的代理地址是:
text
127.0.0.1:1080这对应的是 ssh/autossh 的 -D 1080 模式,也就是动态端口转发。
2. 为什么推荐用 autossh
相比直接用 ssh -D 1080,autossh 的优势是:
- 连接断了以后会自动拉起
- 更适合长期运行
- 更适合配合
launchd做系统级托管
因此如果目标是长期稳定地挂一个本地代理,autossh 比普通 ssh 更合适。
3. 手动命令的含义
推荐使用的命令如下:
bash
autossh -M 0 -f -N -D 1080 \
-o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-o "ExitOnForwardFailure yes" \
your_user@100.x.x.x重点解释:
-D 1080- 在本机开启一个动态代理端口
- 也就是 SOCKS5 代理
-N- 不执行远程 shell 命令
- 只做隧道
-f- 启动后转入后台
-M 0- 关闭 autossh 默认监控端口
- 少占端口,也更简单
ServerAliveInterval 30- 定期做保活
ServerAliveCountMax 3- 多次保活失败后断开,交由 autossh 重连
ExitOnForwardFailure yes- 如果端口没成功监听,就直接失败退出
- 可以避免命令看似启动、实际上代理没起来的情况
4. 为什么建议先做免密登录
如果不做 SSH 免密登录,launchd 开机启动时可能会遇到以下问题:
- 服务在后台等待密码输入
- 没有图形交互输入口令
- 启动失败但表面不明显
因此建议提前配置:
bash
ssh-keygen -t ed25519
ssh-copy-id your_user@100.x.x.x5. LaunchAgent 的作用
在 macOS 下,用户级开机自启通常用:
text
~/Library/LaunchAgents/把 autossh 写入 com.autossh.socks1080.plist 后,launchd 会负责:
- 登录时启动
- 异常退出时按策略重拉
- 记录输出和错误日志
配置里比较关键的字段是:
RunAtLoad- 登录后自动启动
KeepAlive- 异常退出时保持存活
StandardOutPath- 标准输出日志位置
StandardErrorPath- 错误日志位置
6. 旧写法和新写法到底差在哪
旧写法:
bash
launchctl load ~/Library/LaunchAgents/com.autossh.socks1080.plist
launchctl unload ~/Library/LaunchAgents/com.autossh.socks1080.plist新写法:
bash
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.autossh.socks1080.plist
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.autossh.socks1080.plist差异主要是:
- 旧写法是兼容式接口
- 新写法更明确、更符合新版
launchd的域模型 gui/$(id -u)指向当前用户的图形会话域
可以简单理解为:
load/unload还能用bootstrap/bootout是现在更推荐的方式
7. 是否必须重配
不必须。
已经确认到的现象是:
- 服务出现在
launchctl list中 1080端口已经在监听- 错误日志为空
- 代理进程是
ssh
这些都说明现有配置已经正常工作。
所以合理结论是:
- 不需要重写
plist - 不需要为了切换命令风格而推倒重来
- 后续直接改用新命令维护即可
8. 如何判断“真的成功了”
可以分三层确认。
第一层,看 launchctl 是否加载了服务:
bash
launchctl list | grep autossh第二层,看本地 1080 端口是否在监听:
bash
lsof -i :1080如果能看到:
text
ssh ... TCP localhost:socks (LISTEN)这已经很接近成功结论了。
第三层,直接验证代理是否能出网:
bash
curl --socks5 127.0.0.1:1080 https://ifconfig.me如果能正常返回 IP,说明这不是“只监听了端口”,而是真的可用。
9. 已经用旧命令启动了,要不要用旧命令停
不需要。
因为旧命令和新命令最终操作的都是同一个 launchd 服务对象,所以完全可以:
bash
autossh-stop
autossh-start以后统一切换到新方式即可。
10. 为什么要在 ~/.zshrc 里加函数
平时最常见的动作无非是:
- 启动
- 停止
- 重载
- 查状态
- 看日志
如果每次都手敲完整的 launchctl 命令,容易:
- 太长
- 容易写错路径
- 不方便排查
所以把它们封装成函数会更省心。
推荐内容如下:
bash
# autossh launchctl helpers
AUTOSSH_PLIST="$HOME/Library/LaunchAgents/com.autossh.socks1080.plist"
AUTOSSH_DOMAIN="gui/$(id -u)"
AUTOSSH_LABEL="com.autossh.socks1080"
AUTOSSH_OUT_LOG="/tmp/autossh-socks1080.out"
AUTOSSH_ERR_LOG="/tmp/autossh-socks1080.err"
autossh-start() {
launchctl bootstrap "$AUTOSSH_DOMAIN" "$AUTOSSH_PLIST"
}
autossh-stop() {
launchctl bootout "$AUTOSSH_DOMAIN" "$AUTOSSH_PLIST"
}
autossh-reload() {
launchctl bootout "$AUTOSSH_DOMAIN" "$AUTOSSH_PLIST" 2>/dev/null
launchctl bootstrap "$AUTOSSH_DOMAIN" "$AUTOSSH_PLIST"
}
autossh-status() {
echo "== launchctl =="
launchctl print "$AUTOSSH_DOMAIN/$AUTOSSH_LABEL" 2>/dev/null || echo "service not loaded"
echo
echo "== port 1080 =="
lsof -i :1080
}
autossh-log() {
echo "== stdout: $AUTOSSH_OUT_LOG =="
[ -f "$AUTOSSH_OUT_LOG" ] && tail -n 50 "$AUTOSSH_OUT_LOG" || echo "no stdout log"
echo
echo "== stderr: $AUTOSSH_ERR_LOG =="
[ -f "$AUTOSSH_ERR_LOG" ] && tail -n 50 "$AUTOSSH_ERR_LOG" || echo "no stderr log"
}
autossh-log-follow() {
touch "$AUTOSSH_OUT_LOG" "$AUTOSSH_ERR_LOG"
tail -f "$AUTOSSH_OUT_LOG" "$AUTOSSH_ERR_LOG"
}11. 日志怎么用
日志主要看两个文件:
/tmp/autossh-socks1080.out/tmp/autossh-socks1080.err
常见使用方式:
- 看最近日志:
bash
autossh-log- 持续追踪:
bash
autossh-log-follow如果错误日志长期为空,通常是个好现象,表示没有明显报错。
12. 最终建议
最后的建议可以归纳为下面几条:
- 现有配置已经成功,不需要重配
plist文件可以继续使用- 后续管理服务尽量统一使用
bootstrap/bootout - 把快捷函数放到
~/.zshrc,日常维护最方便 - 如果后面怀疑代理异常,优先检查:
autossh-statusautossh-logcurl --socks5 127.0.0.1:1080 https://ifconfig.me