Skip to content

autossh 使用与配置记录

本文整理了 autossh 的使用方式,包括:

  • 如何连接 100.x.x.x
  • 如何在本机开启 1080 SOCKS 代理
  • 如何后台运行
  • 如何开机自启
  • 如何判断是否启动成功
  • 如何用更规范的 launchctl 命令管理服务
  • 如何在 ~/.zshrc 中加入快捷命令和日志查看命令

1. 使用场景

目标是通过 SSH 连接到远端主机 100.x.x.x,并在本机开启一个 SOCKS5 代理:

  • 本地代理地址:127.0.0.1:1080
  • 工具:autossh
  • 要求:
    • 后台运行
    • 自动重连
    • 开机自启

2. 安装 autossh

如果本机还没安装:

bash
brew install autossh

安装完成后可确认路径:

bash
which autossh

常见路径:

  • Apple Silicon Mac: /opt/homebrew/bin/autossh
  • Intel Mac: /usr/local/bin/autossh

3. 先测试普通 SSH

建议先确认普通 SSH 可以连通:

bash
ssh your_user@100.x.x.x

其中 your_user 替换为远端机器上的用户名。

建议配置免密登录,否则开机自启时可能会因为等待密码而失败。

生成密钥:

bash
ssh-keygen -t ed25519

复制公钥到远端:

bash
ssh-copy-id your_user@100.x.x.x

如果没有 ssh-copy-id,也可以手动把公钥内容追加到远端的 ~/.ssh/authorized_keys

4. 手动启动 autossh

最基础的后台运行命令:

bash
autossh -M 0 -f -N -D 1080 your_user@100.x.x.x

参数说明:

  • -M 0:关闭 autossh 默认监控端口
  • -f:放到后台运行
  • -N:不执行远程命令,只建立隧道
  • -D 1080:在本机开启 1080 SOCKS5 代理

更稳妥的推荐写法:

bash
autossh -M 0 -f -N -D 1080 \
  -o "ServerAliveInterval 30" \
  -o "ServerAliveCountMax 3" \
  -o "ExitOnForwardFailure yes" \
  your_user@100.x.x.x

说明:

  • ServerAliveInterval 30:每 30 秒做一次保活
  • ServerAliveCountMax 3:连续 3 次保活失败则断开
  • ExitOnForwardFailure yes:如果端口转发失败则直接退出,避免假启动

5. 配置开机自启

创建 LaunchAgent 配置文件:

bash
mkdir -p ~/Library/LaunchAgents

文件路径:

bash
~/Library/LaunchAgents/com.autossh.socks1080.plist

示例内容如下,记得把 your_user 替换成自己的远端用户名,并确认 autossh 路径正确:

xml
<?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>com.autossh.socks1080</string>

    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/bin/autossh</string>
        <string>-M</string>
        <string>0</string>
        <string>-N</string>
        <string>-D</string>
        <string>1080</string>
        <string>-o</string>
        <string>ServerAliveInterval=30</string>
        <string>-o</string>
        <string>ServerAliveCountMax=3</string>
        <string>-o</string>
        <string>ExitOnForwardFailure=yes</string>
        <string>your_user@100.x.x.x</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

    <key>StandardOutPath</key>
    <string>/tmp/autossh-socks1080.out</string>

    <key>StandardErrorPath</key>
    <string>/tmp/autossh-socks1080.err</string>
</dict>
</plist>

6. 旧命令与更规范的新命令

一开始使用的是旧写法:

bash
launchctl unload ~/Library/LaunchAgents/com.autossh.socks1080.plist
launchctl load ~/Library/LaunchAgents/com.autossh.socks1080.plist

这套命令现在依然经常能用,但它属于较老的兼容写法。

较新的、更规范的用法是:

bash
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.autossh.socks1080.plist
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.autossh.socks1080.plist

区别主要是:

  • load/unload:老语法,仍可用,但不是推荐写法
  • bootstrap/bootout:新语法,更符合现代 macOS 的 launchd 管理方式
  • gui/$(id -u):明确指定当前登录用户的图形会话域

7. 是否需要重新配置

结论是不需要。

原因:

  • 现有 plist 已经成功工作
  • 1080 端口已经在监听
  • 服务已被 launchctl 正常管理
  • 日志文件为空,说明当前没有明显错误

因此:

  • 不需要重写 plist
  • 不需要为了“新语法”而重做配置
  • 以后平时管理服务时,直接改用 bootstrap/bootout 即可

8. 如何判断启动成功

已验证过的检查方式:

bash
launchctl list | grep autossh

如果看到类似:

text
71342	0	com.autossh.socks1080

说明服务已加载。

再看端口:

bash
lsof -i :1080

如果看到类似:

text
ssh ... TCP localhost:socks (LISTEN)

说明本地 1080 SOCKS 代理已经启动成功。

再看错误日志:

bash
cat /tmp/autossh-socks1080.err

如果为空,通常表示当前没有明显报错。

还可以进一步测试代理是否真的可用:

bash
curl --socks5 127.0.0.1:1080 https://ifconfig.me

如果能返回一个 IP,说明代理工作正常。

9. 当前服务已用旧命令启动,是否必须用旧命令停止

不需要。

即使服务最初是通过旧命令启动的,后续也可以直接用新命令管理,因为本质上操作的是同一个 launchd 服务。

推荐切换方式:

bash
autossh-stop
autossh-start

这样之后就可以统一使用新命令。

10. 建议加入 ~/.zshrc 的快捷命令

下面这段可以直接加入 ~/.zshrc

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"
}

生效方式:

bash
source ~/.zshrc

11. 常用命令汇总

启动服务:

bash
autossh-start

停止服务:

bash
autossh-stop

重载服务:

bash
autossh-reload

查看状态:

bash
autossh-status

查看最近日志:

bash
autossh-log

持续追踪日志:

bash
autossh-log-follow

退出日志跟踪:

bash
Ctrl + C

12. 最终结论

当前配置已经是成功的,重点结论如下:

  • autossh 已成功启动
  • 本地 127.0.0.1:1080 SOCKS 代理已监听
  • 当前 plist 配置可继续使用
  • 不需要重新配置
  • 后续建议使用 bootstrap/bootout 管理服务
  • 建议把快捷函数加入 ~/.zshrc,方便日常启动、停止、重载、查状态和看日志