Ubuntu 无 Root 安装 Clash (Mihomo) + Yacd 控制面板 完整指南

📦 一、准备工作

  • 操作系统:Ubuntu Server 20.04 x64
  • 无 root 权限(使用普通用户)
  • 已能通过 SSH 连接

创建工作目录:

mkdir -p ~/clash
cd ~/clash

🧩 二、下载并安装 Mihomo (Clash 核心)

1. 下载核心程序

wget https://github.com/MetaCubeX/mihomo/releases/download/v1.19.15/mihomo-linux-amd64-v1.19.15.gz
gzip -d mihomo-linux-amd64-v1.19.15.gz
mv mihomo-linux-amd64-v1.19.15 clash
chmod +x clash

2. 验证是否可执行

./clash -v

出现版本号即安装成功。


⚙️ 三、导入订阅配置

在本地 Clash Verge 中复制你的订阅链接,然后在服务器执行:

cd ~/clash
curl -L "你的订阅链接" -o config.yaml

验证配置文件:

head -n 10 config.yaml

🌐 四、修改配置文件 (config.yaml)

使用编辑器(如 nanovim)打开:

nano ~/clash/config.yaml

确保包含以下关键配置(可直接复制到文件开头):

port: 7890
socks-port: 7891
allow-lan: true

# 控制面板端口
external-controller: 0.0.0.0:9090
secret: "yourStrongPassword"

# 挂载 UI 文件目录(见后续)
external-ui: ./ui/public

# 启动默认分组(示例)
mode: Rule
log-level: info

保存后退出。


🌍 五、安装 Yacd 面板

1. 下载最新版本

cd ~/clash
mkdir -p ui
wget https://github.com/haishanh/yacd/releases/latest/download/yacd.tar.xz
tar -xf yacd.tar.xz -C ui

解压完成后,确保结构如下:

~/clash/ui/public/index.html

🔑 六、下载 Country.mmdb 地理数据库

(用于显示国旗、GEOIP 规则)

cd ~/clash
wget -O Country.mmdb https://github.com/MetaCubeX/meta-rules-dat/releases/latest/download/Country.mmdb

🚀 七、启动 Clash 核心

cd ~/clash
nohup ./clash -d . > clash.log 2>&1 &

查看运行状态:

tail -f clash.log

出现类似:

RESTful API listening at: 0.0.0.0:9090
Serving UI: /home/ubuntu/clash/ui/public
MMDB loaded

即运行成功 ✅


🧠 八、访问 Yacd 控制面板

方法 1:SSH 本地转发(推荐)

在你本地电脑的 ~/.ssh/config 中添加:

Host my-server
  HostName <你的服务器IP>
  User <用户名>
  LocalForward 9090 127.0.0.1:9090

重新连接:

ssh my-server

然后在浏览器打开:

http://localhost:9090/ui

首次进入若提示连接 API:

  • URL: http://127.0.0.1:9090
  • Secret: yourStrongPassword

连接成功后,就能可视化切换节点、查看日志、测试延迟。


🧰 九、设置环境变量(让远程系统走代理)

临时设置(当前会话有效):

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

测试:

curl -I https://api.openai.com/v1/models

若返回 200 OK → 代理成功。

永久生效(写入 bashrc):

echo 'export http_proxy=http://127.0.0.1:7890' >> ~/.bashrc
echo 'export https_proxy=http://127.0.0.1:7890' >> ~/.bashrc
source ~/.bashrc

🧾 十、后台管理与自检

查看进程:

ps aux | grep clash

停止进程:

pkill clash

查看端口监听:

ss -lntp | grep -E '7890|7891|9090'

查看日志:

tail -n 50 clash.log

✅ 十一、快速诊断脚本(可选)

cat > ~/clash/diag.sh <<'SH'
#!/usr/bin/env bash
set -e
echo "== Clash 进程 =="
pgrep -a clash || echo "未发现 clash 进程"

echo "== 端口监听 =="
ss -lntp | grep -E '7890|7891|9090' || echo "未监听 7890/7891/9090"

echo "== 测试代理连通性 =="
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
curl -m 8 -sS -I https://api.openai.com/v1/models || echo "请求失败(可能节点不可用)"

echo "== 当前出口 IP =="
curl -m 8 -sS ipinfo.io || echo "无法获取出口 IP"
SH
chmod +x ~/clash/diag.sh
bash ~/clash/diag.sh

🎉 十二、完成!

现在你可以:

  • 在浏览器访问 http://localhost:9090/ui 使用图形界面;
  • 在远程终端通过代理访问外网;
  • 让 VS Code Remote-SSH、命令行、curl 等请求全部走代理。

linux运维命令

1、循环执行任务

while true; do df -h; sleep 1; done

2、删除除指定名称之外的所有docker

#!/bin/bash
container_to_keep="ohos-build"
containers_to_remove=$(docker ps -a --format "{{.Names}}" | grep -v $container_to_keep)
if [[ -z "$containers_to_remove" ]]; then
   echo "No containers to remove."
else
   for container in $containers_to_remove; do
       echo "Removing container: $container"
      docker rm -f $container
   done
   echo "All containers removed except for $container_to_keep."
fi

3、查看脚本是否以root权限运行

if [ "$(id -u)" -ne 0 ]; then
 echo -e "${RED}********* 请以root权限执行脚本**********${RESET}"
 exit 1
fi

4、查看脚本是否运行在docker环境下

if grep -q "/docker/" /proc/1/cgroup ; then
 echo -e "${GREEN}已经在docker环境下运行${RESET}"
 exit 0
fi

5、解析脚本传参

#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
RESET='\033[0m'

if [[ "$#" -eq 0 ]]; then
   echo -e "${RED}********全量编译**********${RESET}"
   exit 1
fi

function usage()
{
   echo "Usage: $0 [-t] [-r] [-l] [-d] [-h]"
   echo "无参数 全量编译"
   echo " -t   编译组件"
   echo " -r   快速编译"
   echo " -l   记录的组件名称"
   echo " -d   清空组件记录"
   echo " -h   输出这个帮助信息"
   exit 0
}

while [[ $# -gt 0 ]]
do
key="$1"
case $key in
   -t )
   build_target="$2"
   if ! grep -q "$build_target" $log_file; then
     echo "$build_target" >> $log_file
   fi
  shift # past argument
  shift # past value
  ;;
   -r )
   fast_rebuild=1;
  shift # past argument
  ;;
   -d )
   rm -rfv $log_file
   exit 0
  shift # past argument
  ;;
   -l )
   if [[ -f "$log_file" ]]; then
     cat $log_file
   else
     echo "No targets recorded"
   fi
   exit 0
  shift # past argument
  ;;
   -h )
    usage
     exit 0
    ;;
  *)    # unknown option
   echo "Error: unknown option $1"
   exit 1
  ;;
esac
done
if [[ ! ${build_target} ]]; then
   echo -e "${GREEN}快速全量编译: $build_target${RESET}"
else
   if [[ $fast_rebuild -eq 0 ]]; then
       echo -e "${GREEN}编译组件: $build_target${RESET}"
   else
       echo -e "${GREEN}快速编译组件: $build_target${RESET}"
   fi
fi

6、grep命令

PATTERNS可以包含多个模式,每个模式用换行符分隔。

模式选择和解释:
 -E, --extended-regexp     PATTERNS是扩展的正则表达式
 -F, --fixed-strings       PATTERNS是字符串
 -G, --basic-regexp       PATTERNS是基本的正则表达式
 -P, --perl-regexp         PATTERNS是Perl正则表达式
 -e, --regexp=PATTERNS     使用PATTERNS进行匹配
 -f, --file=FILE           从文件FILE中读取PATTERNS
 -i, --ignore-case         忽略模式和数据中的大小写区别
     --no-ignore-case     不忽略大小写区别(默认)
 -w, --word-regexp         只匹配整个单词
 -x, --line-regexp         只匹配整个行
 -z, --null-data           数据行以0字节结尾,而不是换行符

其他选项:
 -s, --no-messages         不输出错误信息
 -v, --invert-match       选中不匹配的行
 -V, --version             显示版本信息并退出
     --help               显示帮助信息并退出

输出控制:
 -m, --max-count=NUM       选中NUM行后停止
 -b, --byte-offset         在每行输出前显示匹配行的字节偏移量
 -n, --line-number         在每行输出前显示行号
     --line-buffered       每行都输出(默认情况下缓冲输出)
 -H, --with-filename       在每行输出前显示文件名
 -h, --no-filename         不在输出中显示文件名
     --label=LABEL         将标签LABEL用作标准输入文件名前缀
 -o, --only-matching       只显示匹配的非空部分
 -q, --quiet, --silent     不输出任何普通输出
     --binary-files=TYPE   假设二进制文件是TYPE;
                          TYPE可以是'binary'、'text'或'without-match'
 -a, --text               等同于--binary-files=text
 -I                       等同于--binary-files=without-match
 -d, --directories=ACTION 如何处理目录;
                          ACTION可以是'read'、'recurse'或'skip'
 -D, --devices=ACTION     如何处理设备、FIFO和套接字;
                          ACTION可以是'read'或'skip'
 -r, --recursive           递归处理子目录,等同于--directories=recurse
 -R, --dereference-recursive 类似于-r,但是要跟随所有符号链接
     --include=GLOB       只搜索与GLOB匹配的文件
     --exclude=GLOB       跳过与GLOB匹配的文件
     --exclude-from=FILE   跳过与FILE中任何文件模式

7、查找文件位置

find . -name "example.txt" -not -path "./out/*" #排除out目录
find /home/ -type f -name "hello.txt" #在/home/目录下查找普通文件 -tpye f表示普通文件

8、设置网络

ifconfig eth0 192.168.1.115 netmask 255.255.255.0 up   #设置网卡IP

route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.1  #去往任何目的IP都走路由192.168.1.1

echo "nameserver 114.114.114.114" > /etc/resolv.conf  #添加DNS,域名解析用

chmod +s /bin/ping

echo 0 9999999 > /proc/sys/net/ipv4/ping_group_range #解决ping权限问题