Appearance
autossh 使用与配置记录
本文整理了 autossh 的使用方式,包括:
- 如何连接
100.x.x.x - 如何在本机开启
1080SOCKS 代理 - 如何后台运行
- 如何开机自启
- 如何判断是否启动成功
- 如何用更规范的
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:在本机开启1080SOCKS5 代理
更稳妥的推荐写法:
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 ~/.zshrc11. 常用命令汇总
启动服务:
bash
autossh-start停止服务:
bash
autossh-stop重载服务:
bash
autossh-reload查看状态:
bash
autossh-status查看最近日志:
bash
autossh-log持续追踪日志:
bash
autossh-log-follow退出日志跟踪:
bash
Ctrl + C12. 最终结论
当前配置已经是成功的,重点结论如下:
autossh已成功启动- 本地
127.0.0.1:1080SOCKS 代理已监听 - 当前
plist配置可继续使用 - 不需要重新配置
- 后续建议使用
bootstrap/bootout管理服务 - 建议把快捷函数加入
~/.zshrc,方便日常启动、停止、重载、查状态和看日志