Update mh wrapper features and docs

This commit is contained in:
Lihatoo 2026-07-01 12:18:49 +08:00
parent afd10467e5
commit 87060094d7
3 changed files with 516 additions and 375 deletions

165
README.md
View file

@ -1,98 +1,127 @@
# mh (mihomo wrapper)
# mh
>基于 mihomo 的纯ubuntu终端控制梯子工具适合简单全局控制与
`mh` 是一个面向 Ubuntu 终端的 mihomo 包装脚本,用来管理 profile、启动/停止 mihomo、切换节点、输出 shell 代理环境变量,以及开关 TUN
mihomo: https://github.com/mihomo/mihomo
# 部署
## 部署
将目录下的`mh`复制到`/usr/local/bin`下,并添加执行权限。
```bash
sudo chmod +x mh # 给予执行权限
sudo setcap cap_net_admin,cap_net_raw+ep /home/lht/bfile/mihomo/mihomo # 给予网络tun权限
```
然后在任何终端都可以使用`mh`命令。
目录内需要包含:
# 使用
## 导入
> 支持两种导入方法
```bash
mh add name path
mh add name url
mh select name # 选择一个配置
```
分别是订阅链接或者是某个已配置好的`yaml`文件
得到如下的项目结构
```json
tnt
├── cache.db
├── config.yaml # 这是mh生成的配置文件用于启动mihomo
├── geoip.metadb # 这是运行中生成的文件
├── mihomo.log # 这是日志可以用config.yaml 的log_file 指定error,warning,info,debug
└── providers
└── tnt.yaml # 这是提供节点的文件,来自你的订阅链接,tnt为你输入的名称
current.profile # 保存是否需要tun配置
run.pid # 运行时保存的进程id目前只能支持起一个mihomo
```
## 换节点
- `mh`:控制脚本
- `mihomo`mihomo 可执行文件
- `<profile>/config.yaml`profile 配置,通常由 `mh add` 生成
```bash
mh -l # 列出搜索可选择节点
mh name # 搜索并列表选择节点
chmod +x mh
sudo setcap cap_net_admin,cap_net_raw+ep "$(pwd)/mihomo"
```
## 其他操作
如需全局使用,可以把 `mh` 放到 `PATH` 中。脚本会优先使用当前目录里的 `mihomo` 作为工作目录;如果当前目录没有 `mihomo`,才使用脚本所在目录。`/usr/local/bin` 不会被当作 profile 根目录;从其他目录运行时可通过 `MIHOMO_ROOT=/path/to/mihomo mh ...` 显式指定。
## 常用命令
```bash
mh tun on/off # 开启/关闭tun,可能需要sudo权限
mh env # 输出当前 shell 可用的代理 export 片段
mh mode rule/global/direct # 切换运行模式
mh rules show/reset # 查看或重置内建基础规则
mh -h # 帮助
mh # 快速预览信息
mh db # 一些测试debug专用
sudo -E apt install ...#如果下载没有网络,则是环境没有导入
mh add <name> <url|file> # 添加订阅或本地 provider
mh select [name] # 切换/启动 profile
mh start <name> # 等价于 select <name>
mh end # 停止 mihomo
mh env # 输出代理 export
mh theme [name] # 查看或切换输出主题
mh sysproxy [on|off|status] # 开关 GNOME 系统代理
mh update [all|provider] # 更新当前 profile 的 HTTP provider
mh mode rule|global|direct # 切换模式
mh rules show|reset # 查看/重置基础规则
mh tun [on|off|toggle] # 开关 TUN
mh list [keyword] # 列出节点并可输入序号切换
mh <keyword> # 搜索节点并按延迟排序选择
mh doctor # 诊断信息
```
如果要让当前 shell 立刻走代理,不能只执行 `mh`,因为它是子进程,没法反向修改你的父 shell 环境。要这样用:
让当前 shell 立刻走代理:
```bash
eval "$(mh env)"
```
默认输出的是 `127.0.0.1:7897`,和常见 GUI 代理端口保持一致。也可以把 `mh env` 的输出写进 `~/.bashrc` / `~/.zshrc`
## 基础规则
默认 mixed-port 是 `127.0.0.1:7890`socks-port 是 `127.0.0.1:7891`API 是 `127.0.0.1:9090`
现在新建的 profile 默认走一套很简单的规则:
- 局域网、本地回环直连
- 其他流量走 `Final`
- `Final` 默认选择 `Proxy`
可以直接调整:
输出主题可以切换:
```bash
mh mode rule # 规则模式
mh mode global # 全局代理
mh mode direct # 全局直连
mh rules show # 查看当前规则
mh rules reset # 重置成内建基础规则
mh theme # 查看当前主题
mh theme list # 查看可选主题
mh theme basic # 基础版,最稳
mh theme ganyu # 原神甘雨风格
mh theme kaomoji # 颜文字版,适合 emoji 显示不完整的终端
mh theme minimal # 极简版
```
# 错误
> 主要错误都可以看看`mihomo.log`文件,从其中分析
## 网络dns解析失败
> 节点正常搜索,测速正常,可是无法使用(浏览器,网站)
> 查看日志,前面下载正常,就是网络解析不了
GNOME/Ubuntu 桌面可以让 `mh` 帮你开系统代理:
`mh db`选择7 ,看看有几个dns
```bash
mh sysproxy status
mh sysproxy on # HTTP/HTTPS -> 127.0.0.1:7890, SOCKS -> 127.0.0.1:7891
mh sysproxy off
```
问我这里显示有两个dns也就是说错误的ip解析可能来自另一个干扰的`tailscale0`(我这里是这个)
## Profile
`mh add name url` 会生成类似结构:
```text
name/
config.yaml
mihomo.log
providers/
name.yaml
current.profile
run.pid
```
新 profile 默认使用 `rule` 模式:本地/内网直连,其余流量走 `Final``Final` 默认选择 `Proxy`
`providers/<name>.yaml` 只保存订阅下发的节点;`config.yaml` 保存 mh 管理的端口、模式、代理组和规则。mihomo 启动时会读取 `config.yaml`,再按 `proxy-providers` 引用 provider 节点,两者是组合生效。更新订阅只更新 provider 节点文件,不会覆盖本地规则。
域名排除写在当前 profile 的 `bypass.list`,格式尽量贴近 FLClash
```text
*zhihu.com
*zhimg.com
*jd.com
100ime-iat-api.xfyun.cn
*360buyimg.com
localhost
*.local
127.*
10.*
```
执行 `mh rules reset` 后,`mh` 会把它编译进 `config.yaml``rules`,例如:
```yaml
rules:
- DOMAIN-SUFFIX,zhihu.com,DIRECT
- DOMAIN,100ime-iat-api.xfyun.cn,DIRECT
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- MATCH,Final
```
默认订阅更新间隔是 1 天:`interval: 86400`。默认日志级别是 `error`,减少 `mihomo.log` 输出。
## 排错
优先看:
```bash
mh doctor
tail -n 80 <profile>/mihomo.log
```
如果 TUN 启动失败,确认当前用户有 root 权限,或已经给 `mihomo` 设置 `cap_net_admin,cap_net_raw`
终端可用但浏览器不可用时,通常是浏览器没有使用 shell 里的 `http_proxy` 环境变量。mihomo core 本身只负责监听本地端口或 TUNFLClash 能“一键开”,是因为 GUI 额外帮你设置了系统代理或 TUN。处理方式三选一
- 开启 TUN`mh tun on`
- 开启 GNOME 系统代理:`mh sysproxy on`
- 在系统或浏览器代理里手动设置 HTTP/HTTPS 代理为 `127.0.0.1:7890`SOCKS 为 `127.0.0.1:7891`