WSL下的Mihomo命令行版本配置指南

1. 环境准备

1.1 创建工作目录

# 输入命令
mkdir -p ~/.config/mihomo
cd ~/.config/mihomo
pwd
# 实际输出
(base) yuuu@DESKTOP-M32KRCT:~/.config/mihomo$ mkdir -p ~/.config/mihomo
(base) yuuu@DESKTOP-M32KRCT:~/.config/mihomo$ cd ~/.config/mihomo
(base) yuuu@DESKTOP-M32KRCT:~/.config/mihomo$ pwd
/home/yuuu/.config/mihomo

1.2 下载Mihomo

# 输入命令
wget https://github.com/MetaCubeX/mihomo/releases/download/v1.19.3/mihomo-linux-amd64-v1.19.3.gz
# 实际输出
--2025-03-23 20:35:08--  https://github.com/MetaCubeX/mihomo/releases/download/v1.19.3/mihomo-linux-amd64-v1.19.3.gz
Resolving github.com (github.com)... 20.205.243.166
Connecting to github.com (github.com)|20.205.243.166|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/369178935/78184ca4-301f-4b2f-b971-38caf83fb9b4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250323%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250323T123505Z&X-Amz-Expires=300&X-Amz-Signature=ae34067c6838fc9d244ea24bb439df4a41361d5a3c1562aa9e30edeaf7de1950&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmihomo-linux-amd64-v1.19.3.gz&response-content-type=application%2Foctet-stream [following]
--2025-03-23 20:35:09--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/369178935/78184ca4-301f-4b2f-b971-38caf83fb9b4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250323%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250323T123505Z&X-Amz-Expires=300&X-Amz-Signature=ae34067c6838fc9d244ea24bb439df4a41361d5a3c1562aa9e30edeaf7de1950&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmihomo-linux-amd64-v1.19.3.gz&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.111.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11995266 (11M) [application/octet-stream]
Saving to: 'mihomo-linux-amd64-v1.19.3.gz'
mihomo-linux-amd64-v1.19.3.gz              100%[=====================================================================================>]  11.44M  18.8MB/s    in 0.6s
2025-03-23 20:35:10 (18.8 MB/s) - 'mihomo-linux-amd64-v1.19.3.gz' saved [11995266/11995266]

1.3 解压和设置权限

# 输入命令
gzip -d mihomo-linux-amd64-v1.19.3.gz
mv mihomo-linux-amd64-v1.19.3 mihomo
chmod +x mihomo
ls -l mihomo
# 实际输出
# gzip、mv、chmod命令无输出,表示执行成功
# ls -l命令输出:
-rwxr-xr-x 1 yuuu yuuu 32260244 Mar  3 11:59 mihomo

2. 配置文件设置

2.1 创建配置目录结构

# 输入命令
mkdir -p providers
ls
# 实际输出
(base) yuuu@DESKTOP-M32KRCT:~/.config/mihomo$ mkdir -p providers
(base) yuuu@DESKTOP-M32KRCT:~/.config/mihomo$ ls
config.yaml  mihomo  providers

2.2 创建并编辑配置文件

2.2.1 主配置文件 (config.yaml)
# HTTP(S) 代理端口
mixed-port: 7890
# 允许局域网
allow-lan: true
# 绑定地址
bind-address: '*'
# 运行模式
mode: rule
# 日志等级
log-level: info
# API接口(用于查询节点信息)
external-controller: '127.0.0.1:9090'
# DNS 设置
dns:
enable: true
ipv6: false
default-nameserver: [119.29.29.29, 223.5.5.5]
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
use-hosts: true
nameserver: [119.29.29.29, 223.5.5.5, 1.1.1.1, 8.8.4.4]
fallback: [119.29.29.29, 223.5.5.5, 1.1.1.1, 8.8.4.4]
fallback-filter: { geoip: true, ipcidr: [240.0.0.0/4, 0.0.0.0/32] }
# 代理提供者
proxy-providers:
zy_wsl_xfltd:
type: file
path: ./providers/zy_wsl_xfltd.yaml
health-check:
enable: true
interval: 600
url: http://www.gstatic.com/generate_204
# 代理组
proxy-groups:
- name: XFLTD
type: select
proxies:
- 自动选择
- 故障转移
- DIRECT
use:
- zy_wsl_xfltd
- name: 自动选择
type: url-test
url: http://www.gstatic.com/generate_204
interval: 86400
tolerance: 50
use:
- zy_wsl_xfltd
- name: 故障转移
type: fallback
url: http://www.gstatic.com/generate_204
interval: 7200
use:
- zy_wsl_xfltd
# 规则
rules:
# 直连规则
- DOMAIN,xfltd.net,DIRECT
- DOMAIN-SUFFIX,cn,DIRECT
- DOMAIN-KEYWORD,-cn,DIRECT
- GEOIP,CN,DIRECT
# 代理规则
- DOMAIN-SUFFIX,google.com,XFLTD
- DOMAIN-SUFFIX,google.com.hk,XFLTD
- DOMAIN-SUFFIX,googleapis.com,XFLTD
- DOMAIN-SUFFIX,gmail.com,XFLTD
- DOMAIN-SUFFIX,youtube.com,XFLTD
- DOMAIN-SUFFIX,youtu.be,XFLTD
- DOMAIN-SUFFIX,github.com,XFLTD
- DOMAIN-SUFFIX,github.io,XFLTD
- DOMAIN-SUFFIX,githubusercontent.com,XFLTD
- DOMAIN-SUFFIX,githubassets.com,XFLTD
# 广告屏蔽
- DOMAIN-KEYWORD,admarvel,REJECT
- DOMAIN-KEYWORD,admaster,REJECT
- DOMAIN-KEYWORD,adsage,REJECT
- DOMAIN-KEYWORD,adsmogo,REJECT
- DOMAIN-KEYWORD,adsrvmedia,REJECT
- DOMAIN-KEYWORD,adwords,REJECT
- DOMAIN-KEYWORD,adservice,REJECT
- DOMAIN-SUFFIX,appsflyer.com,REJECT
- DOMAIN-SUFFIX,doubleclick.net,REJECT
# 局域网
- IP-CIDR,127.0.0.0/8,DIRECT
- IP-CIDR,172.16.0.0/12,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT
- IP-CIDR,17.0.0.0/8,DIRECT
- IP-CIDR,100.64.0.0/10,DIRECT
- IP-CIDR,224.0.0.0/4,DIRECT
- IP-CIDR6,fe80::/10,DIRECT
# 最终规则
- MATCH,XFLTD
2.2.2 节点配置文件 (providers/zy_wsl_xfltd.yaml)
proxies:
- name: "剩余流量:15.17 GB"
type: trojan
server: cn1.cdn.xfltd-cdn.top
port: 12001
password: 2502b101-a626-4b99-82ed-c6447d9ccab0
udp: true
sni: cdn.alibaba.com
skip-cert-verify: true
- name: "套餐到期:长期有效"
type: trojan
server: cn1.cdn.xfltd-cdn.top
port: 12001
password: 2502b101-a626-4b99-82ed-c6447d9ccab0
udp: true
sni: cdn.alibaba.com
skip-cert-verify: true
- name: " 香港 01"
type: trojan
server: cn1.cdn.xfltd-cdn.top
port: 12001
password: 2502b101-a626-4b99-82ed-c6447d9ccab0
udp: true
sni: cdn.alibaba.com
skip-cert-verify: true
# ... 更多节点配置 ...
# 为了文档简洁,这里省略了其他节点的配置
# 实际使用时请将完整的节点配置添加到此处

3. 服务管理配置

3.1 创建启动脚本

# 输入命令
vim ~/.config/mihomo/start-mihomo.sh
# 脚本内容
#!/bin/bash
cd ~/.config/mihomo
./mihomo -d . > mihomo.log 2>&1 &
# 设置权限
chmod +x start-mihomo.sh

3.2 配置自动启动

# 编辑.bashrc文件
vim ~/.bashrc
# 添加以下内容到文件末尾
# 启动Mihomo代理服务
if ! pgrep -f "mihomo -d" > /dev/null; then
~/.config/mihomo/start-mihomo.sh
fi
# 使配置生效
source ~/.bashrc

3.3 创建代理控制脚本

# 创建脚本文件
vim ~/.config/mihomo/proxy.sh
# 脚本内容
#!/bin/bash
# 配置
MIHOMO_PATH="$HOME/.config/mihomo"
PROXY_HOST="127.0.0.1"
PROXY_PORT="7890"
API_PORT="9090"
# 检查依赖
check_dependencies() {
if ! command -v jq &> /dev/null; then
echo "错误: 未找到 jq 命令"
echo "请运行以下命令安装 jq:"
echo "sudo apt update && sudo apt install jq"
exit 1
fi
}
# 不使用jq的备选解析函数
parse_json() {
local json=$1
local key=$2
echo "$json" | grep -o "\"$key\":\"[^\"]*\"" | sed "s/\"$key\":\"//" | sed "s/\"//g"
}
# 帮助信息
show_help() {
echo "Usage: proxy <command> [options]"
  echo
  echo "Commands:"
  echo "  on                    开启代理"
  echo "  off                   关闭代理"
  echo "  status                显示当前状态"
  echo
  echo "  mode <mode>           切换代理模式"
    echo "    global              - 全局模式"
    echo "    direct              - 直连模式"
    echo "    rule                - 规则模式"
    echo
    echo "  switch <node>         切换代理节点"
      echo "    auto                - 自动选择"
      echo "    <node>              - 指定节点"
        echo
        echo "  now                   显示当前节点"
        echo "  delay                 显示当前节点延迟"
        echo "  list                  显示所有节点"
        echo "  test                  测试所有节点延迟"
        echo
        echo "  help                  显示本帮助信息"
        echo
        echo "注意: 本脚本依赖 jq 命令来解析 JSON。如果未安装,请运行:"
        echo "sudo apt update && sudo apt install jq"
        echo "注意: 带空格的节点名称需要使用引号,例如:"
        echo '  proxy switch " 香港 05"'
        }
        # 检查服务状态
        check_service() {
        pgrep -f "mihomo -d" > /dev/null
        return $?
        }
        # 启动服务
        start_service() {
        if ! check_service; then
        $MIHOMO_PATH/start-mihomo.sh
        sleep 2
        fi
        }
        # 停止服务
        stop_service() {
        if check_service; then
        pkill -f "mihomo -d"
        fi
        }
        # 设置环境变量
        set_proxy() {
        export http_proxy="http://$PROXY_HOST:$PROXY_PORT"
        export https_proxy="http://$PROXY_HOST:$PROXY_PORT"
        }
        # 清除环境变量
        unset_proxy() {
        unset http_proxy
        unset https_proxy
        }
        # 切换代理模式
        switch_mode() {
        local mode=$1
        curl -H "Content-Type: application/json" -X PATCH http://$PROXY_HOST:$API_PORT/configs \
        -d "{\"mode\":\"$mode\"}"
        }
        # 切换代理节点
        switch_node() {
        local node=$1
        curl -H "Content-Type: application/json" -X PUT http://$PROXY_HOST:$API_PORT/proxies/XFLTD \
        -d "{\"name\":\"$node\"}"
        }
        # 获取当前节点(带备选实现)
        get_current_node() {
        local response=$(curl -s -H "Content-Type: application/json" -X GET http://$PROXY_HOST:$API_PORT/proxies/XFLTD)
        if command -v jq &> /dev/null; then
        echo "$response" | jq -r '.now'
        else
        parse_json "$response" "now"
        fi
        }
        # 获取节点延迟
        get_delay() {
        local node=$1
        # URL encode the node name
        local encoded_node=$(echo "$node" | sed 's/ /%20/g')
        # 首先检查是否是代理组
        local node_info=$(curl -s -H "Content-Type: application/json" -X GET "http://$PROXY_HOST:$API_PORT/proxies/$encoded_node")
        if [ -z "$node_info" ]; then
        echo "错误: 无法获取节点信息" >&2
        return 1
        fi
        local node_type=$(echo "$node_info" | jq -r '.type')
        # 如果是代理组,获取当前使用的节点
        if [[ "$node_type" == "Selector" || "$node_type" == "URLTest" || "$node_type" == "Fallback" ]]; then
        local actual_node=$(echo "$node_info" | jq -r '.now')
        echo "debug: 代理组 '$node' 当前使用节点: $actual_node" >&2
        node=$actual_node
        encoded_node=$(echo "$actual_node" | sed 's/ /%20/g')
        fi
        # 确保curl使用代理
        local curl_proxy="http://$PROXY_HOST:$PROXY_PORT"
        # 使用最稳定的测试URL
        local urls=(
        "http://www.gstatic.com/generate_204"
        "http://cp.cloudflare.com/generate_204"
        )
        for test_url in "${urls[@]}"; do
        # URL encode the test URL
        local encoded_test_url=$(echo "$test_url" | sed 's/:/%3A/g' | sed 's/\//%2F/g')
        echo "debug: 正在使用 $test_url 测试节点 $node" >&2
        # 使用GET请求,参数通过URL传递
        local delay_info=$(curl -v -s -x "$curl_proxy" \
        -H "Content-Type: application/json" \
        --connect-timeout 3 \
        -X GET "http://$PROXY_HOST:$API_PORT/proxies/$encoded_node/delay?timeout=5000&url=$encoded_test_url" 2>&1)
        echo "debug: curl响应: $delay_info" >&2
        # 尝试解析延迟值
        if [ -n "$delay_info" ]; then
        local delay=$(echo "$delay_info" | grep -o '"delay":[0-9]*' | cut -d':' -f2)
        if [ -n "$delay" ] && [ "$delay" != "null" ]; then
        echo "debug: 成功获取延迟: ${delay}ms" >&2
        echo "{\"delay\": $delay}"
        return 0
        fi
        fi
        # 如果第一个URL失败,尝试下一个
        continue
        done
        echo "debug: 所有URL测试失败" >&2
        echo '{"delay": -1}'
        return 1
        }
        # 获取所有节点
        get_all_nodes() {
        curl -s -H "Content-Type: application/json" -X GET http://$PROXY_HOST:$API_PORT/proxies
        }
        # 主函数
        main() {
        # 检查依赖
        if [ "$1" != "help" ]; then
        check_dependencies
        fi
        case $1 in
        "on")
        start_service
        set_proxy
        echo "代理已开启"
        ;;
        "off")
        stop_service
        unset_proxy
        echo "代理已关闭"
        ;;
        "status")
        if check_service; then
        echo "代理服务: 运行中"
        if command -v jq &> /dev/null; then
        echo "当前模式: $(curl -s http://$PROXY_HOST:$API_PORT/configs | jq -r .mode)"
        echo "当前节点: $(get_current_node)"
        else
        echo "当前节点: $(get_current_node)"
        echo "提示: 安装 jq 可以获取更多信息"
        fi
        else
        echo "代理服务: 未运行"
        fi
        ;;
        "mode")
        case $2 in
        "global"|"direct"|"rule")
        switch_mode $2
        echo "已切换到${2}模式"
        ;;
        *)
        echo "无效的模式,可用模式: global, direct, rule"
        ;;
        esac
        ;;
        "switch")
        if [ -z "$2" ]; then
        echo "请指定节点"
        exit 1
        fi
        # 合并所有参数为完整节点名称
        shift
        node_name="$*"
        # 检查节点是否存在
        if ! echo "$(get_all_nodes)" | jq -e --arg name "$node_name" '.proxies | has($name)' > /dev/null; then
        echo "错误: 节点 '$node_name' 不存在"
        echo "可用节点列表:"
        get_all_nodes | jq -r '.proxies | keys[]' | grep -v "^COMPATIBLE\|^DIRECT\|^GLOBAL\|^PASS\|^REJECT"
        exit 1
        fi
        switch_node "$node_name"
        echo "已切换到节点: $node_name"
        ;;
        "now")
        echo "当前节点: $(get_current_node)"
        ;;
        "delay")
        current_node=$(get_current_node)
        echo "当前节点: $current_node"
        if [[ "$current_node" == "自动选择" || "$current_node" == "故障转移" ]]; then
        # 如果是代理组,获取该组当前使用的节点
        actual_node=$(curl -s -H "Content-Type: application/json" \
        -X GET http://$PROXY_HOST:$API_PORT/proxies/$current_node | jq -r '.now')
        echo "实际使用节点: $actual_node"
        delay_info=$(get_delay "$actual_node")
        delay=$(echo "$delay_info" | jq .delay)
        if [ "$delay" == "-1" ] || [ "$delay" == "null" ]; then
        echo "延迟测试失败"
        else
        echo "延迟: ${delay}ms"
        fi
        else
        # 直接获取节点延迟
        delay_info=$(get_delay "$current_node")
        delay=$(echo "$delay_info" | jq .delay)
        if [ "$delay" == "-1" ] || [ "$delay" == "null" ]; then
        echo "延迟测试失败"
        else
        echo "延迟: ${delay}ms"
        fi
        fi
        ;;
        "list")
        get_all_nodes | jq -r '.proxies | keys[]'
        ;;
        "test")
        echo "测试所有节点延迟..."
        # 获取所有节点信息
        nodes_info=$(get_all_nodes)
        # 过滤并保留完整的节点名称
        while IFS= read -r node; do
        # 跳过特殊节点
        if [[ "$node" == "DIRECT" ]] || [[ "$node" == "REJECT" ]] || \
        [[ "$node" == "XFLTD" ]] || [[ "$node" == "自动选择" ]] || \
        [[ "$node" == "故障转移" ]] || [[ "$node" == *"流量"* ]] || \
        [[ "$node" == *"套餐"* ]]; then
        continue
        fi
        printf "%-30s" "$node:"
        delay=$(get_delay "$node" | jq .delay)
        if [ "$delay" == "-1" ] || [ "$delay" == "null" ]; then
        echo "超时"
        else
        echo "${delay}ms"
        fi
        done < <(echo "$nodes_info" | jq -r '.proxies | keys[]')
        ;;
        "help"|*)
        show_help
        ;;
        esac
        }
        main "$@"
3.3.1 设置脚本权限
chmod +x ~/.config/mihomo/proxy.sh
3.3.2 添加别名
# 添加到 ~/.bashrc
echo 'alias proxy="bash ~/.config/mihomo/proxy.sh"' >> ~/.bashrc
source ~/.bashrc
3.3.3 使用示例
# 开启代理
proxy on
# 切换到全局模式
proxy mode global
# 切换到自动选择节点
proxy switch auto
# 查看当前节点
proxy now
# 测试所有节点延迟
proxy test
# 查看帮助
proxy help

4. 启动和测试

4.1 启动服务

# 输入命令
~/.config/mihomo/start-mihomo.sh
# 检查服务状态
ps aux | grep mihomo

4.2 配置代理环境变量

# 设置临时代理环境变量
(base) yuuu@DESKTOP-M32KRCT:~$ export http_proxy=http://127.0.0.1:7890
(base) yuuu@DESKTOP-M32KRCT:~$ export https_proxy=http://127.0.0.1:7890
# 验证环境变量设置
(base) yuuu@DESKTOP-M32KRCT:~$ echo $http_proxy
http://127.0.0.1:7890
(base) yuuu@DESKTOP-M32KRCT:~$ echo $https_proxy
http://127.0.0.1:7890
# 添加到.bashrc实现永久配置
(base) yuuu@DESKTOP-M32KRCT:~$ echo 'export http_proxy=http://127.0.0.1:7890' >> ~/.bashrc
(base) yuuu@DESKTOP-M32KRCT:~$ echo 'export https_proxy=http://127.0.0.1:7890' >> ~/.bashrc
(base) yuuu@DESKTOP-M32KRCT:~$ source ~/.bashrc

4.3 验证代理

# 输入命令
curl -v https://www.google.com

4.4 查看和切换节点

# 查看XFLTD代理组当前使用的节点
curl -H "Content-Type: application/json" -X GET http://127.0.0.1:9090/proxies/XFLTD
# 输出示例(精简):
{
"name": "XFLTD",
"type": "Selector",
"now": "自动选择",
"all": ["自动选择", "故障转移", "DIRECT", " 香港 01", " 香港 02", ...]
}
# 查看自动选择组当前使用的节点
curl -H "Content-Type: application/json" -X GET http://127.0.0.1:9090/proxies/自动选择
# 输出示例(精简):
{
"name": "自动选择",
"type": "URLTest",
"now": " 日本 05",  # 当前使用的节点
"all": [" 香港 01", " 香港 02", ...]
}
# 查看所有节点信息(包括延迟等状态)
curl -H "Content-Type: application/json" -X GET http://127.0.0.1:9090/proxies
# 输出示例(精简):
{
"proxies": {
"DIRECT": {"type": "Direct", "alive": true},
"REJECT": {"type": "Reject", "alive": true},
"XFLTD": {
"type": "Selector",
"now": "自动选择"
},
"自动选择": {
"type": "URLTest",
"now": " 日本 05"
},
" 香港 01": {
"alive": true,
"history": [{"time": "2025-03-23T21:58:26.284851039+08:00", "delay": 377}]
},
" 日本 05": {
"alive": true,
"history": [{"time": "2025-03-23T21:58:26.846059041+08:00", "delay": 241}]
}
}
}
# 切换到特定节点,比如切换到香港01
curl -H "Content-Type: application/json" -X PUT http://127.0.0.1:9090/proxies/XFLTD -d '{"name":" 香港 01"}'

5. 日常维护操作

5.1 查看日志

tail -f ~/.config/mihomo/mihomo.log

5.2 停止服务

pkill -f "mihomo -d"

5.3 重启服务

pkill -f "mihomo -d"
~/.config/mihomo/start-mihomo.sh

5.4 延迟测试问题及解决方案

5.4.1 问题描述
  1. 延迟测试超时问题:

    • 默认超时时间(15秒)过长,导致测试缓慢
    • 多次重试(每个URL 3次)增加了等待时间
    • 过多的测试URL点(6个)造成冗余
  2. 节点名称处理问题:

    • 节点名称中的Unicode字符(如国旗表情符号)在处理时丢失
    • 节点名称被错误简化(如" 日本 05"变成"日本")
    • URL编码不完整导致请求失败
  3. 错误处理问题:

    • 404错误(“Resource not found”)由于节点名称不匹配
    • 调试信息过于冗长,不易定位问题
5.4.2 解决方案
  1. 优化延迟测试:

    # 减少超时时间
    --connect-timeout 3 \  # 连接超时3秒
    timeout=5000          # 总超时5秒
    # 精简测试URL
    local urls=(
    "http://www.gstatic.com/generate_204"
    "http://cp.cloudflare.com/generate_204"
    )
    # 移除多次重试
    # 如果第一个URL失败,直接尝试下一个
  2. 改进节点名称处理:

    # 完整保留节点名称,包括表情符号
    nodes_info=$(get_all_nodes)
    while IFS= read -r node; do
    # 处理完整节点名称
    done < <(echo "$nodes_info" | jq -r '.proxies | keys[]')
    # 正确的URL编码
    local encoded_node=$(echo "$node" | sed 's/ /%20/g')
  3. 优化显示格式:

    # 使用更宽的显示列以适应完整节点名称
    printf "%-30s" "$node:"
    # 清晰的状态显示
    if [ "$delay" == "-1" ] || [ "$delay" == "null" ]; then
    echo "超时"
    else
    echo "${delay}ms"
    fi
5.4.3 效果改进
  1. 性能提升:

    • 延迟测试速度提高约3倍
    • 失败判定更快速
    • 资源占用更少
  2. 可靠性提升:

    • 正确处理所有类型的节点名称
    • 更准确的延迟测试结果
    • 更清晰的错误提示
  3. 用户体验改进:

    • 更整洁的输出格式
    • 更快的响应速度
    • 更准确的节点信息显示

5.5 节点切换问题及解决方案

5.5.1 问题描述
  1. 节点名称解析问题:

    • 带空格的节点名称被bash解释为多个参数
    • 包含表情符号(Unicode字符)的节点名称处理不当
    • 导致"Selector update error: proxy not exist"错误
  2. 错误提示不明确:

    • 未能正确提示节点名称格式问题
    • 没有显示可用的节点列表
5.5.2 解决方案
  1. 参数处理改进:
# 合并所有参数为完整节点名称
shift
node_name="$*"
# 检查节点是否存在
if ! echo "$(get_all_nodes)" | jq -e --arg name "$node_name" '.proxies | has($name)' > /dev/null; then
echo "错误: 节点 '$node_name' 不存在"
echo "可用节点列表:"
get_all_nodes | jq -r '.proxies | keys[]' | grep -v "^COMPATIBLE\|^DIRECT\|^GLOBAL\|^PASS\|^REJECT"
exit 1
fi
  1. 使用说明改进:
# 在帮助信息中添加带空格节点名称的使用说明
echo "注意: 带空格的节点名称需要使用引号,例如:"
echo '  proxy switch " 香港 05"'
5.5.3 使用示例
  1. 切换到特定节点:
# 使用单引号
proxy switch ' 香港 05'
已切换到节点:  香港 05
# 使用双引号
proxy switch " 香港 05"
已切换到节点:  香港 05
# 验证当前节点
proxy now
当前节点:  香港 05
  1. 切换到代理组:
# 切换到自动选择
proxy switch '自动选择'
已切换到节点: 自动选择
# 验证当前节点
proxy now
当前节点: 自动选择
5.5.4 注意事项
  1. 节点名称使用引号:

    • 必须使用单引号或双引号包裹带空格的节点名称
    • 特别是包含表情符号的节点名称
  2. 验证切换结果:

    • 使用 proxy now 命令验证切换是否成功
    • 如果切换失败,检查节点名称是否正确
  3. 查看可用节点:

    • 使用 proxy list 命令查看所有可用节点
    • 确保使用完整的节点名称进行切换
posted on 2025-10-02 22:47  ycfenxi  阅读(38)  评论(0)    收藏  举报