Skip to content

autossh 详细说明

这是一份详细说明版,适合后续回看,主要解释每一步为什么这么做,以及当前配置是否需要调整。

1. 本次需求的本质

本次配置的目标不是让远端机器监听 1080 端口,而是:

  • 通过 SSH 登录到 100.x.x.x
  • 在本机开启一个 SOCKS5 代理
  • 本地代理端口为 1080
  • 让连接尽量稳定
  • 让它能后台运行并开机自启

最终本机可用的代理地址是:

text
127.0.0.1:1080

这对应的是 ssh/autossh-D 1080 模式,也就是动态端口转发。

2. 为什么推荐用 autossh

相比直接用 ssh -D 1080autossh 的优势是:

  • 连接断了以后会自动拉起
  • 更适合长期运行
  • 更适合配合 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.x

5. 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-status
    • autossh-log
    • curl --socks5 127.0.0.1:1080 https://ifconfig.me