linux设置mihomo,无界面版本

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

1. 环境准备

1.1 创建工作目录

bash 复制代码
# 输入命令
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

bash 复制代码
# 输入命令
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 解压和设置权限

bash 复制代码
# 输入命令
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 创建配置目录结构

bash 复制代码
# 输入命令
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)
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)
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 创建启动脚本

bash 复制代码
# 输入命令
vim ~/.config/mihomo/start-mihomo.sh

# 脚本内容
#!/bin/bash
cd ~/.config/mihomo
./mihomo -d . > mihomo.log 2>&1 &

# 设置权限
chmod +x start-mihomo.sh

3.2 配置自动启动

bash 复制代码
# 编辑.bashrc文件
vim ~/.bashrc

# 添加以下内容到文件末尾
# 启动Mihomo代理服务
if ! pgrep -f "mihomo -d" > /dev/null; then
    ~/.config/mihomo/start-mihomo.sh
fi

# 使配置生效
source ~/.bashrc

3.3 创建代理控制脚本

bash 复制代码
# 创建脚本文件
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 设置脚本权限
bash 复制代码
chmod +x ~/.config/mihomo/proxy.sh
3.3.2 添加别名
bash 复制代码
# 添加到 ~/.bashrc
echo 'alias proxy="bash ~/.config/mihomo/proxy.sh"' >> ~/.bashrc
source ~/.bashrc
3.3.3 使用示例
bash 复制代码
# 开启代理
proxy on

# 切换到全局模式
proxy mode global

# 切换到自动选择节点
proxy switch auto

# 查看当前节点
proxy now

# 测试所有节点延迟
proxy test

# 查看帮助
proxy help

4. 启动和测试

4.1 启动服务

bash 复制代码
# 输入命令
~/.config/mihomo/start-mihomo.sh

# 检查服务状态
ps aux | grep mihomo

4.2 配置代理环境变量

bash 复制代码
# 设置临时代理环境变量
(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 验证代理

bash 复制代码
# 输入命令
curl -v https://www.google.com

4.4 查看和切换节点

bash 复制代码
# 查看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 查看日志

bash 复制代码
tail -f ~/.config/mihomo/mihomo.log

5.2 停止服务

bash 复制代码
pkill -f "mihomo -d"

5.3 重启服务

bash 复制代码
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. 优化延迟测试:

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

    bash 复制代码
    # 完整保留节点名称,包括表情符号
    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. 优化显示格式:

    bash 复制代码
    # 使用更宽的显示列以适应完整节点名称
    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. 参数处理改进:
bash 复制代码
# 合并所有参数为完整节点名称
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. 使用说明改进:
bash 复制代码
# 在帮助信息中添加带空格节点名称的使用说明
echo "注意: 带空格的节点名称需要使用引号,例如:"
echo '  proxy switch "🇭🇰 香港 05"'
5.5.3 使用示例
  1. 切换到特定节点:
bash 复制代码
# 使用单引号
proxy switch '🇭🇰 香港 05'
已切换到节点: 🇭🇰 香港 05

# 使用双引号
proxy switch "🇭🇰 香港 05"
已切换到节点: 🇭🇰 香港 05

# 验证当前节点
proxy now
当前节点: 🇭🇰 香港 05
  1. 切换到代理组:
bash 复制代码
# 切换到自动选择
proxy switch '自动选择'
已切换到节点: 自动选择

# 验证当前节点
proxy now
当前节点: 自动选择
5.5.4 注意事项
  1. 节点名称使用引号:

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

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

    • 使用 proxy list 命令查看所有可用节点
    • 确保使用完整的节点名称进行切换
相关推荐
榆榆欸18 分钟前
2.基于多线程的TCP服务器实现
服务器·tcp/ip
MingDong52321 分钟前
移动WiFi设备品牌推荐与选购指南
运维·服务器
AredRabbit1 小时前
微软和Linux
linux·微软·操作系统
武帝为此1 小时前
【计算机网络编码与调制】
服务器·网络·计算机网络
孤独打铁匠Julian1 小时前
【Linux】Hadoop-3.4.1的伪分布式集群的初步配置
linux·hadoop·ubuntu
下北泽天使1 小时前
linux的权限管理
linux·运维·服务器
rufeike2 小时前
计算机组网实例
运维
蒋星熠2 小时前
关于在vscode中的Linux 0.11 应用程序项目的生成和运行
linux·ide·vscode
小码农<^_^>2 小时前
linux环境变量
java·linux·运维
sakabu2 小时前
Linux安装MySQL数据库并使用C语言进行数据库开发
linux·c语言·数据库·笔记·mysql·数据库开发