预计阅读时间:10 分钟
教程不保证一定能配置好,请结合实际情况,主要影响因素是yaml文件
1.创建文件夹
mkdir -p ~/.config/clash
mkdir ~/clash
2.将从官网下载好的文件移动到~/clash文件夹
解压文件
cd ~/clash
tar -xvf clash_2.0.24_linux_amd64.tar.gz
3.将解压出的文件重命名为clash
mv 原文件名 clash
4.从代理服务商下载.yaml配置文件
方法1:
下载clash 配置文件config.yaml (注意:这个订阅链接是自己的,替代 [订阅链接],如果失败了说明订阅链接有问题)
cd ~/.config/clash
wget -O config.yaml [订阅链接]
方法2:复制本机的yaml文件到服务器上
若你本机具有🔮魔法网络,请把yml文件(或yaml文件)复制粘贴到~/.config/clash文件夹中,并更名为xxx.yaml
若为yml文件:
mv ~/.config/clash/xxx.yml ~/.config/clash/config.yaml
执行完方法1或方法2后下一步:
并在yaml中设置秘钥
mixed-port: 7890
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
external-controller: '127.0.0.1:9090'
# 秘钥
secret: '123456' #<-添加进去这行
设置好后,每次访问测速记得都要带上秘钥才会有信息回显。如果不设置秘钥有的版本会不显示信息
5.创建一个用于开启/关闭系统代理的可执行文件(通用)
cd ~/clash
touch clash_proxy.sh
vim clash_proxy.sh
写入命令
#!/bin/bash
# ===============================================
# 🛰 Clash 系统代理开关脚本
# 用法:
# ./clash_proxy.sh on -> 开启代理
# ./clash_proxy.sh off -> 关闭代理
# ===============================================
# ======= 请根据实际情况修改 =======
HTTP_PROXY="http://127.0.0.1:7890"
HTTPS_PROXY="http://127.0.0.1:7890"
ALL_PROXY="socks5://127.0.0.1:7891"
BASHRC="$HOME/.bashrc" # 针对当前用户永久生效
# ===============================================
function enable_proxy() {
echo "🔹 开启系统代理..."
export http_proxy="$HTTP_PROXY"
export https_proxy="$HTTPS_PROXY"
export all_proxy="$ALL_PROXY"
# 写入 ~/.bashrc,实现新终端自动生效
if ! grep -q "http_proxy" "$BASHRC"; then
echo "" >> "$BASHRC"
echo "# Clash 系统代理" >> "$BASHRC"
echo "export http_proxy=\"$HTTP_PROXY\"" >> "$BASHRC"
echo "export https_proxy=\"$HTTPS_PROXY\"" >> "$BASHRC"
echo "export all_proxy=\"$ALL_PROXY\"" >> "$BASHRC"
fi
echo "✅ 系统代理已开启"
echo " HTTP/HTTPS -> $HTTP_PROXY"
echo " SOCKS -> $ALL_PROXY"
}
function disable_proxy() {
echo "🔹 关闭系统代理..."
unset http_proxy
unset https_proxy
unset all_proxy
# 从 ~/.bashrc 移除代理配置
if grep -q "Clash 系统代理" "$BASHRC"; then
sed -i '/# Clash 系统代理/,+3d' "$BASHRC"
fi
echo "✅ 系统代理已关闭"
}
# 检查参数
if [ "$1" == "on" ]; then
enable_proxy
elif [ "$1" == "off" ]; then
disable_proxy
else
echo "用法: $0 [on|off]"
exit 1
fi
6.赋予可执行权限
chmod +x clash
chmod +x clash_proxy.sh
7.启动clash
# 前台启动(用于临时测试)
./clash -d ~/.config/clash
# 后台启动并挂起
nohup ./clash -d ~/.config/clash > output.log 2>&1 &
注:这一步可能会出现没有MMDB的问题,解决方案如下:
解决方案
日志信息:
INFO[0000] Can't find MMDB, start download
- 先等待3分钟,若出现以下信息说明安装成功,跳出本解决方案即可。若还是没反应,就继续往下看解决方案
INFO[...] Download MMDB successful
- 尝试手动MMDB文件
- 方法1:从官网下载(失败概率较大)
wget -O ~/.config/clash/Country.mmdb https://raw.githubusercontent.com/Dreamacro/maxmind-geoip/release/Country.mmdb
- 方法2:或备用源:(可能非常慢)
wget -O ~/.config/clash/Country.mmdb https://cdn.jsdelivr.net/gh/Dreamacro/maxmind-geoip@release/Country.mmdb
-
方法3:你本机下载(若你本机有🔮魔法网络) 浏览器访问
https://raw.githubusercontent.com/Dreamacro/maxmind-geoip/release/Country.mmdb即可直接下载 -
赋予clash写入权限
chmod -R 755 ~/.config/clash
- 重新启动clash
./clash -d ~/.config/clash
8.启动系统代理
# 开启系统代理
./clash_proxy.sh on
or
# 关闭系统代理
./clash_proxy.sh off
9.测试所有节点并选择(其他🔮魔法网络不一定好用)
注:若你的魔法网络不能用该脚本,就把yaml配置文件发给ai,让它帮你生成一个测速并选择节点的脚本
创建choose.sh脚本,用来自动测速并选择延迟最低的节点(仅供参考,可能会根据yaml文件结构的改变而不适用)
touch choose.sh
vim choose.sh
#!/usr/bin/env bash
# 自动选择 Clash 中延迟最低的真实节点(修复空格被拆分的问题)
# 依赖:curl jq python3
# 保存为 ~/clash/choose_best_fixed.sh
API="http://127.0.0.1:9090"
SECRET="123456" # 改成你实际的 secret
TEST_URL="https://www.google.com"
TIMEOUT=5000
echo "🚀 正在从 Clash 获取节点列表..."
ALL_JSON=$(curl -s -H "Authorization: Bearer ${SECRET}" "${API}/proxies")
if [[ "$ALL_JSON" == *"Unauthorized"* ]]; then
echo "❌ 未授权:请检查 SECRET 是否正确"
exit 1
fi
# 抽取“真实节点”的 key(排除 Selector/URLTest/Fallback/Direct/Reject)
# 并把每一行读进数组,保留空格和特殊字符
mapfile -t NODES < <(echo "$ALL_JSON" | jq -r '
.proxies
| to_entries[]
| select(.value.type != "Selector" and .value.type != "URLTest" and .value.type != "Fallback" and .value.type != "Direct" and .value.type != "Reject")
| .key
')
if [ "${#NODES[@]}" -eq 0 ]; then
echo "❌ 未找到可测速的节点(列表为空)"
exit 1
fi
echo "📡 开始逐个实时测速(timeout=${TIMEOUT}ms)..."
BEST_NODE=""
BEST_DELAY=999999
# 输出表头
printf "%-6s %s\n" "延迟" "节点名"
printf "%-6s %s\n" "----" "----"
for NODE in "${NODES[@]}"; do
# 用 argv 方式传参给 python 以避免引号/特殊字符问题
ENCODED=$(python3 -c "import sys,urllib.parse as u; print(u.quote(sys.argv[1]))" "$NODE")
RESP=$(curl -s -H "Authorization: Bearer ${SECRET}" "${API}/proxies/${ENCODED}/delay?timeout=${TIMEOUT}&url=${TEST_URL}")
# 取 delay(null 表示超时或不可达)
DELAY=$(echo "$RESP" | jq -r '.delay // "null"')
if [[ "$DELAY" == "null" ]] || [[ "$DELAY" == "0" ]]; then
printf "%-6s %s\n" "timeout" "$NODE"
else
printf "%-6sms %s\n" "$DELAY" "$NODE"
# 更新最优
if (( DELAY < BEST_DELAY )); then
BEST_DELAY=$DELAY
BEST_NODE=$NODE
fi
fi
done
if [ -z "$BEST_NODE" ]; then
echo "❌ 没有找到可用节点(所有测速均超时或返回 0)"
exit 1
fi
echo
echo "🏆 最优节点:$BEST_NODE (${BEST_DELAY}ms)"
echo "🛰 正在将 GLOBAL 设置为该节点..."
# 用 jq 构造 JSON body,避免手动拼接出错
BODY=$(jq -nc --arg name "$BEST_NODE" '{"name":$name}')
ENCODED_BEST=$(python3 -c "import sys,urllib.parse as u; print(u.quote(sys.argv[1]))" "$BEST_NODE")
curl -s -X PUT -H "Authorization: Bearer ${SECRET}" -H "Content-Type: application/json" \
-d "$BODY" "${API}/proxies/GLOBAL" >/dev/null
echo "✅ 已切换 GLOBAL 为: $BEST_NODE"
赋予执行权限并执行程序
chmod +x choose.sh
./choose.sh
10.创建一个更方便启动clash的脚本(所有🔮魔法网络通用)
touch switch.sh
vim switch.sh
复制粘贴以下内容
#!/bin/bash
# switch.sh - 控制 Clash 代理和系统代理
# 使用方法:
# ./switch.sh open # 开启 clash + 系统代理
# ./switch.sh close # 关闭 clash + 系统代理
CLASH_DIR="$HOME/clash"
CLASH_CONFIG="$HOME/.config/clash"
OUTPUT_LOG="$CLASH_DIR/output.log"
case "$1" in
open)
echo "🔹 开启系统代理..."
"$CLASH_DIR/clash_proxy.sh" on
echo "🔹 启动 Clash 后台..."
# 检查是否已经启动
if pgrep -f "clash -d $CLASH_CONFIG" > /dev/null; then
echo "⚠ Clash 已经在运行"
else
nohup "$CLASH_DIR/clash" -d "$CLASH_CONFIG" > "$OUTPUT_LOG" 2>&1 &
sleep 1
echo "✅ Clash 已启动"
fi
;;
close)
echo "🔹 关闭系统代理..."
"$CLASH_DIR/clash_proxy.sh" off
echo "🔹 停止 Clash 后台..."
# 获取 Clash PID 并 kill
PIDS=$(ps -aux | grep "[c]lash -d $CLASH_CONFIG" | awk '{print $2}')
if [ -z "$PIDS" ]; then
echo "⚠ Clash 没有运行"
else
echo "$PIDS" | xargs kill
echo "✅ Clash 已停止"
fi
;;
*)
echo "用法: $0 {open|close}"
exit 1
;;
esac
- 赋予可执行权限
chmod +x switch.sh
使用方法: - 开启代理和clash:
./switch.sh open
- 关闭代理和clash
./switch.sh close
补充:一些测试命令
没有jq就下载一个
# 查询节点的命令:(123456是秘钥的位置)
curl -H "Authorization: Bearer 123456" http://127.0.0.1:9090/proxies
# 直观显示
curl -H "Authorization: Bearer 123456" http://127.0.0.1:9090/proxies | jq
# 切换节点
curl -X PUT -H "Authorization: Bearer abc123" \
-H "Content-Type: application/json" \
-d '{"name": "香港节点"}' \
http://127.0.0.1:9090/chooproxies/自动选择
本文由 changchang 原创,转载请注明出处。