背景
在 ppu 服务器(Alibaba Cloud Linux 3, x86_64,非容器,裸机)上安装 Mihomo(原 Clash Meta 内核),用订阅 URL 拉取代理节点,跑一个本地 HTTP/SOCKS 混合代理端口,供需要代理的进程按需使用。
安全提示:本文档中的 SSH 密码、订阅 token 均已替换为占位符,实际值不写入笔记。
0. 前置:非交互 SSH 登录(本机执行)
本机(macOS)没有 sshpass,且 brew install hudochenkov/sshpass/sshpass 因 Command Line Tools 过旧一度失败,改用系统自带的 expect 写自动登录脚本。
踩坑点:远程是 root 用户,shell 提示符结尾是 # 不是 $ ,用 expect "$ " 死活匹配不上,只能靠超时兜底,导致命令乱序、输出错位。修正为正则匹配 [#\$] $,并且干脆用「远程命令写入本地文件 + expect 从文件读取」的方式,避免命令行多层引号转义(订阅 URL 里有 ?、=、token= 这类字符)。
/tmp/ppu_ssh_file.sh:
#!/usr/bin/expect -f
set timeout 90
set fname [lindex $argv 0]
set fp [open $fname r]
set remote_cmd [read $fp]
close $fp
log_user 1
spawn ssh ppu
expect {
"password:" { send "<PPU_SSH_PASSWORD>\r" }
"yes/no" { send "yes\r"; exp_continue }
}
expect -re {[#\$] $}
send -- "$remote_cmd\r"
expect -re {__CMD_DONE__}
send "exit\r"
expect eof用法:把要在远程执行的命令写到一个文件(比如 /tmp/remote_cmd.txt),结尾加一行 echo __CMD_DONE__ 作为完成标记,然后:
chmod +x /tmp/ppu_ssh_file.sh
/tmp/ppu_ssh_file.sh /tmp/remote_cmd.txt1. 探测远程环境
uname -a
cat /etc/os-release | head -5
whoami
which mihomo clash结果:Alibaba Cloud Linux 3 (Soaring Falcon),x86_64,root,未安装 mihomo/clash。
2. 探测网络连通性(直连 GitHub 是否可用)
curl -m 8 -o /dev/null -s -w 'github: %{http_code} time:%{time_total}\n' https://github.com
curl -m 8 -o /dev/null -s -w 'raw.githubusercontent: %{http_code} time:%{time_total}\n' https://raw.githubusercontent.com
curl -m 8 -o /dev/null -s -w 'baidu: %{http_code}\n' https://www.baidu.com结论:能连上但不稳定,后面下载 release 大文件时会暴露问题。
3. 查询 mihomo 最新版本 & 下载链接
curl -m 15 -sL https://api.github.com/repos/MetaCubeX/mihomo/releases/latest -o /tmp/mihomo_release.json
grep -o '"tag_name": *"[^"]*"' /tmp/mihomo_release.json
grep -o 'https://github.com/MetaCubeX/mihomo/releases/download/[^"]*linux-amd64[^"]*' /tmp/mihomo_release.json当时最新版本:v1.19.29,Alibaba Cloud Linux 是 RHEL 系,选 .rpm 包:
https://github.com/MetaCubeX/mihomo/releases/download/v1.19.29/mihomo-linux-amd64-v1.19.29.rpm
4. 直连下载失败排查
第一次、第二次直接 curl/wget 下载这个 rpm,两次拿到的文件大小完全不一样(1.2MB / 241KB),装的时候报错:
package mihomo-1.19.29-1.x86_64 does not verify: Payload SHA256 digest: BAD
用 wget -c 断点续传重试也复现了:
HTTP request sent, awaiting response... Read error (Success.) in headers.
Retrying.
...
Connecting to github.com|20.205.243.166|:443... failed: Connection timed out.
结论:直连 github.com 下载大文件时连接被反复打断/超时,不是文件本身问题(正常 mihomo 二进制应该在 15~20MB,之前下到的 1.2MB/241KB 都是被截断的坏文件)。
清理残留的僵尸下载进程:
pkill -9 -f 'wget.*mihomo'5. 换用 GitHub 加速镜像下载
依次尝试几个公共镜像站,命中第一个可用的:
cd /tmp && rm -f mihomo.rpm
for M in 'https://ghfast.top/' 'https://gh-proxy.com/' 'https://mirror.ghproxy.com/'; do
echo TRY:$M
curl -m 30 -sL -o mihomo.rpm "${M}https://github.com/MetaCubeX/mihomo/releases/download/v1.19.29/mihomo-linux-amd64-v1.19.29.rpm" \
-w 'code:%{http_code} size:%{size_download}\n'
SZ=$(stat -c%s mihomo.rpm 2>/dev/null || echo 0)
if [ "$SZ" -gt 1000000 ]; then
echo GOT_IT_VIA:$M
break
fi
donehttps://ghfast.top/ 命中,拿到完整的 17.7MB 文件。
6. 校验并安装
file /tmp/mihomo.rpm
rpm -K --nosignature /tmp/mihomo.rpm # 输出: digests OK
rpm -ivh --replacepkgs /tmp/mihomo.rpm确认安装结果:
mihomo -v
which mihomo
rpm -ql mihomo-1.19.29-1Mihomo Meta v1.19.29 linux amd64 with go1.26.5
Use tags: with_gvisor
/usr/bin/mihomo
/etc/mihomo/config.yaml
/usr/lib/systemd/system/mihomo.service
/usr/lib/systemd/system/mihomo@.service
/usr/share/licenses/mihomo/LICENSE
7. 写入订阅配置
选择方案:HTTP/SOCKS 混合端口(mixed-port),非 TUN 全局代理。
理由:这台机器是共享计算节点,还要靠 SSH 连上去跑训练/推理任务;TUN 模式会接管全机流量,一旦配置有问题可能直接把当前 SSH 连接搞断、影响其他用户任务。混合端口模式只影响手动设置了 http_proxy/https_proxy 环境变量的进程,风险小很多。
/etc/mihomo/config.yaml:
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
external-controller: 127.0.0.1:9090
proxy-providers:
my_sub:
type: http
url: "<你的订阅URL,形如 https://xxx.com/xxx?token=xxx>"
interval: 3600
path: /etc/mihomo/providers/my_sub.yaml
health-check:
enable: true
interval: 600
url: http://www.gstatic.com/generate_204
proxy-groups:
- name: PROXY
type: select
use:
- my_sub
rules:
- MATCH,PROXY写入并启动:
mkdir -p /etc/mihomo/providers
cat > /etc/mihomo/config.yaml <<'MIHOMOEOF'
# ...(同上)
MIHOMOEOF
systemctl enable --now mihomo8. 验证
systemctl status mihomo --no-pager -l
journalctl -u mihomo --no-pager -n 40
curl -x http://127.0.0.1:7890 -m 10 -sI https://www.google.com关键日志:
Mixed(http+socks) proxy listening at: 127.0.0.1:7890
Start initial provider my_sub
[TCP] mihomo --> xxx.com:443 match Match using PROXY[COMPATIBLE]
测试请求返回:
HTTP/1.1 200 Connection established
代理跑通。
9. 日常使用
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890只对设置了这两个环境变量的终端/进程生效(如 curl/pip/git),不影响其他会话和 SSH 本身。
常用运维命令:
systemctl restart mihomo # 改完 config.yaml 后重启生效
systemctl status mihomo # 查看运行状态
journalctl -u mihomo -f # 实时看日志
curl http://127.0.0.1:9090/proxies | jq # 查看当前节点列表(RESTful API)待办 / 可选优化
- 按域名分流规则(国内直连、国外走代理),而不是全部
MATCH,PROXY - 接入可视化面板(yacd / metacubexd)管理节点和规则
- 多订阅节点时配置
url-test自动测速选优