From 7cedb2baedfc36358d6237e2ac5cd5843abbb86b Mon Sep 17 00:00:00 2001 From: zeyu10 Date: Thu, 8 May 2025 11:18:51 +0800 Subject: [PATCH 1/4] optimit start.sh, add --skip-download-config and --skip-edit-profile to skip procedures --- README.md | 3 +- start.sh | 297 ++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 191 insertions(+), 109 deletions(-) diff --git a/README.md b/README.md index 9bbe1a7..d515007 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,6 @@ # 使用须知 -- 运行本项目建议使用root用户,或者使用 sudo 提权。 - 使用过程中如遇到问题,请优先查已有的 [issues](https://github.com/wanhebin/clash-for-linux/issues)。 - 在进行issues提交前,请替换提交内容中是敏感信息(例如:订阅地址)。 - 本项目是基于 [clash](https://github.com/Dreamacro/clash) 、[yacd](https://github.com/haishanh/yacd) 进行的配置整合,关于clash、yacd的详细配置请去原项目查看。 @@ -18,6 +17,8 @@ - 运行前请手动更改`.env`文件中的`CLASH_URL`变量值,否则无法正常运行。 - 当前在RHEL系列和Debian系列Linux系统中测试过,其他系列可能需要适当修改脚本。 - 支持 x86_64/aarch64 平台 +- 如果配置已经下载过,用户可以通过 `--skip-download-config` 参数跳过下载配置文件的步骤。 +- 如果用户不希望写入 /etc/profile.d/clash.sh,可以使用 `--skip-edit-profile` 参数跳过写入操作。 > **注意**:当你在使用此项目时,遇到任何无法独自解决的问题请优先前往 [Issues](https://github.com/wanhebin/clash-for-linux/issues) 寻找解决方法。由于空闲时间有限,后续将不再对Issues中 “已经解答”、“已有解决方案” 的问题进行重复性的回答。 diff --git a/start.sh b/start.sh index d11dcb4..e8cd989 100644 --- a/start.sh +++ b/start.sh @@ -9,6 +9,7 @@ export Server_Dir=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) # 加载.env变量文件 +echo "正在加载环境变量..." source $Server_Dir/.env # 给二进制启动程序、脚本等添加可执行权限 @@ -24,12 +25,33 @@ Conf_Dir="$Server_Dir/conf" Temp_Dir="$Server_Dir/temp" Log_Dir="$Server_Dir/logs" -# 将 CLASH_URL 变量的值赋给 URL 变量,并检查 CLASH_URL 是否为空 -URL=${CLASH_URL:?Error: CLASH_URL variable is not set or empty} - # 获取 CLASH_SECRET 值,如果不存在则生成一个随机数 Secret=${CLASH_SECRET:-$(openssl rand -hex 32)} +# 初始化跳过下载配置标志 +SKIP_DOWNLOAD_CONFIG=false + +# 处理命令行参数 +# 初始化跳过编辑profile标志 +SKIP_EDIT_PROFILE=false + +# 处理命令行参数 +while [[ $# -gt 0 ]]; do + case $1 in + --skip-download-config) + SKIP_DOWNLOAD_CONFIG=true + shift + ;; + --skip-edit-profile) + SKIP_EDIT_PROFILE=true + shift + ;; + *) + echo "未知参数: $1" + exit 1 + ;; + esac +done #################### 函数定义 #################### @@ -70,7 +92,157 @@ if_success() { fi } +# 检查订阅地址并下载配置文件 +check_and_download_config() { + local clash_url="$1" + local temp_dir="$2" + local conf_dir="$3" + # 将 CLASH_URL 变量的值赋给 URL 变量,并检查 CLASH_URL 是否为空 + local url=${clash_url:?Error: clash_url variable is not set or empty} + + # 检查url是否有效 + echo -e '\n正在检测订阅地址...' + local Text1="Clash订阅地址可访问!" + local Text2="Clash订阅地址不可访问!" + + # 检查URL格式 + if [[ ! $url =~ ^https?:// ]]; then + echo -e "\033[31m[ERROR] 无效的URL格式: $url\033[0m" + echo -e "URL必须以 http:// 或 https:// 开头" + exit 1 + fi + + # 尝试解析域名 + local domain=$(echo "$url" | sed -E 's|^https?://([^/]+).*|\1|') + if ! host "$domain" >/dev/null 2>&1; then + echo -e "\033[31m[ERROR] 无法解析域名: $domain\033[0m" + echo -e "请检查网络连接和DNS设置" + exit 1 + fi + + # 检查URL可访问性 + curl -o /dev/null -L -k -sS --retry 5 -m 10 --connect-timeout 10 -w "%{http_code}" "$url" | grep -E '^[23][0-9]{2}$' &>/dev/null + local ReturnStatus=$? + if_success "$Text1" "$Text2" $ReturnStatus + + # 拉取更新config.yml文件 + echo -e '\n正在下载Clash配置文件...' + local Text3="配置文件config.yaml下载成功!" + local Text4="配置文件config.yaml下载失败,退出启动!" + + # 尝试使用curl进行下载 + curl -L -k -sS --retry 5 -m 10 -o "$temp_dir/clash.yaml" "$url" + ReturnStatus=$? + if [ $ReturnStatus -ne 0 ]; then + echo -e "\033[33m[WARN] curl下载失败,尝试使用wget...\033[0m" + # 如果使用curl下载失败,尝试使用wget进行下载 + for i in {1..10} + do + wget -q --no-check-certificate -O "$temp_dir/clash.yaml" "$url" + ReturnStatus=$? + if [ $ReturnStatus -eq 0 ]; then + break + else + echo -e "\033[33m[WARN] 第 $i 次wget下载尝试失败\033[0m" + sleep 1 + fi + done + fi + if_success "$Text3" "$Text4" $ReturnStatus + + # 检查下载的文件是否存在且非空 + if [ ! -s "$temp_dir/clash.yaml" ]; then + echo -e "\033[31m[ERROR] 下载的配置文件为空或不存在\033[0m" + exit 1 + fi + + # 重命名clash配置文件 + \cp -a "$temp_dir/clash.yaml" "$temp_dir/clash_config.yaml" + + ## 判断订阅内容是否符合clash配置文件标准,尝试转换(当前不支持对 x86_64 以外的CPU架构服务器进行clash配置文件检测和转换,此功能将在后续添加) + if [[ $CpuArch =~ "x86_64" || $CpuArch =~ "amd64" ]]; then + echo -e '\n判断订阅内容是否符合clash配置文件标准:' + bash $Server_Dir/scripts/clash_profile_conversion.sh + sleep 3 + fi + + ## Clash 配置文件重新格式化及配置 + # 取出代理相关配置 + #sed -n '/^proxies:/,$p' $Temp_Dir/clash.yaml > $Temp_Dir/proxy.txt + sed -n '/^proxies:/,$p' $Temp_Dir/clash_config.yaml > $Temp_Dir/proxy.txt + + # 合并形成新的config.yaml + cat $Temp_Dir/templete_config.yaml > $Temp_Dir/config.yaml + cat $Temp_Dir/proxy.txt >> $Temp_Dir/config.yaml + \cp $Temp_Dir/config.yaml $Conf_Dir/ +} + +# 启动Clash服务 +start_clash_service() { + local server_dir="$1" + local conf_dir="$2" + local log_dir="$3" + + echo -e '\n正在启动Clash服务...' + local Text5="服务启动成功!" + local Text6="服务启动失败!" + if [[ $CpuArch =~ "x86_64" || $CpuArch =~ "amd64" ]]; then + nohup $server_dir/bin/clash-linux-amd64 -d $conf_dir &> $log_dir/clash.log & + ReturnStatus=$? + if_success $Text5 $Text6 $ReturnStatus + elif [[ $CpuArch =~ "aarch64" || $CpuArch =~ "arm64" ]]; then + nohup $server_dir/bin/clash-linux-arm64 -d $conf_dir &> $log_dir/clash.log & + ReturnStatus=$? + if_success $Text5 $Text6 $ReturnStatus + elif [[ $CpuArch =~ "armv7" ]]; then + nohup $server_dir/bin/clash-linux-armv7 -d $conf_dir &> $log_dir/clash.log & + ReturnStatus=$? + if_success $Text5 $Text6 $ReturnStatus + else + echo -e "\033[31m\n[ERROR] Unsupported CPU Architecture!\033[0m" + exit 1 + fi +} + +# 配置系统代理环境变量 +setup_proxy_env() { + # 检查是否有root权限 + if [ "$(id -u)" -ne 0 ]; then + echo -e "\033[31m[ERROR] 设置系统代理环境变量需要root权限\033[0m" + echo -e "请使用sudo或以root用户身份运行此脚本" + return 0 + fi + + # 添加环境变量(root权限) + cat>/etc/profile.d/clash.sh</dev/null -curl -o /dev/null -L -k -sS --retry 5 -m 10 --connect-timeout 10 -w "%{http_code}" $URL | grep -E '^[23][0-9]{2}$' &>/dev/null -ReturnStatus=$? -if_success $Text1 $Text2 $ReturnStatus - -# 拉取更新config.yml文件 -echo -e '\n正在下载Clash配置文件...' -Text3="配置文件config.yaml下载成功!" -Text4="配置文件config.yaml下载失败,退出启动!" - -# 尝试使用curl进行下载 -curl -L -k -sS --retry 5 -m 10 -o $Temp_Dir/clash.yaml $URL -ReturnStatus=$? -if [ $ReturnStatus -ne 0 ]; then - # 如果使用curl下载失败,尝试使用wget进行下载 - for i in {1..10} - do - wget -q --no-check-certificate -O $Temp_Dir/clash.yaml $URL - ReturnStatus=$? - if [ $ReturnStatus -eq 0 ]; then - break - else - continue - fi - done +if [ "$SKIP_DOWNLOAD_CONFIG" = false ]; then + check_and_download_config "$CLASH_URL" "$Temp_Dir" "$Conf_Dir" +else + echo -e "\n[INFO] 跳过配置文件下载..." fi -if_success $Text3 $Text4 $ReturnStatus - -# 重命名clash配置文件 -\cp -a $Temp_Dir/clash.yaml $Temp_Dir/clash_config.yaml - - -## 判断订阅内容是否符合clash配置文件标准,尝试转换(当前不支持对 x86_64 以外的CPU架构服务器进行clash配置文件检测和转换,此功能将在后续添加) -if [[ $CpuArch =~ "x86_64" || $CpuArch =~ "amd64" ]]; then - echo -e '\n判断订阅内容是否符合clash配置文件标准:' - bash $Server_Dir/scripts/clash_profile_conversion.sh - sleep 3 -fi - - -## Clash 配置文件重新格式化及配置 -# 取出代理相关配置 -#sed -n '/^proxies:/,$p' $Temp_Dir/clash.yaml > $Temp_Dir/proxy.txt -sed -n '/^proxies:/,$p' $Temp_Dir/clash_config.yaml > $Temp_Dir/proxy.txt - -# 合并形成新的config.yaml -cat $Temp_Dir/templete_config.yaml > $Temp_Dir/config.yaml -cat $Temp_Dir/proxy.txt >> $Temp_Dir/config.yaml -\cp $Temp_Dir/config.yaml $Conf_Dir/ # Configure Clash Dashboard Work_Dir=$(cd $(dirname $0); pwd) @@ -155,59 +277,18 @@ Dashboard_Dir="${Work_Dir}/dashboard/public" sed -ri "s@^# external-ui:.*@external-ui: ${Dashboard_Dir}@g" $Conf_Dir/config.yaml sed -r -i '/^secret: /s@(secret: ).*@\1'${Secret}'@g' $Conf_Dir/config.yaml - -## 启动Clash服务 -echo -e '\n正在启动Clash服务...' -Text5="服务启动成功!" -Text6="服务启动失败!" -if [[ $CpuArch =~ "x86_64" || $CpuArch =~ "amd64" ]]; then - nohup $Server_Dir/bin/clash-linux-amd64 -d $Conf_Dir &> $Log_Dir/clash.log & - ReturnStatus=$? - if_success $Text5 $Text6 $ReturnStatus -elif [[ $CpuArch =~ "aarch64" || $CpuArch =~ "arm64" ]]; then - nohup $Server_Dir/bin/clash-linux-arm64 -d $Conf_Dir &> $Log_Dir/clash.log & - ReturnStatus=$? - if_success $Text5 $Text6 $ReturnStatus -elif [[ $CpuArch =~ "armv7" ]]; then - nohup $Server_Dir/bin/clash-linux-armv7 -d $Conf_Dir &> $Log_Dir/clash.log & - ReturnStatus=$? - if_success $Text5 $Text6 $ReturnStatus -else - echo -e "\033[31m\n[ERROR] Unsupported CPU Architecture!\033[0m" - exit 1 -fi - # Output Dashboard access address and Secret echo '' echo -e "Clash Dashboard 访问地址: http://:9090/ui" echo -e "Secret: ${Secret}" echo '' -# 添加环境变量(root权限) -cat>/etc/profile.d/clash.sh< Date: Thu, 8 May 2025 11:20:10 +0800 Subject: [PATCH 2/4] optimit start.sh, add --skip-download-config and --skip-edit-profile to skip procedures --- start.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/start.sh b/start.sh index e8cd989..d6e584d 100644 --- a/start.sh +++ b/start.sh @@ -31,7 +31,6 @@ Secret=${CLASH_SECRET:-$(openssl rand -hex 32)} # 初始化跳过下载配置标志 SKIP_DOWNLOAD_CONFIG=false -# 处理命令行参数 # 初始化跳过编辑profile标志 SKIP_EDIT_PROFILE=false From 09aff5c6e5715ac3e5501fbd1b04379633b0c778 Mon Sep 17 00:00:00 2001 From: zeyu10 Date: Thu, 8 May 2025 11:39:07 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=98=E7=9B=98?= =?UTF-8?q?=E5=8C=BA=E5=9B=BE=E6=A0=87=EF=BC=8C=E5=B9=B6=E4=B8=94=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E9=80=9A=E8=BF=87=E5=8F=82=E6=95=B0=20--skip-tray-ico?= =?UTF-8?q?n=20=E8=B7=B3=E8=BF=87=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- icon/Clash_Logo.png | Bin 0 -> 14428 bytes icon/README.md | 13 ++++++++++ shutdown.sh | 8 ++++++ start.sh | 61 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100755 icon/Clash_Logo.png create mode 100755 icon/README.md diff --git a/icon/Clash_Logo.png b/icon/Clash_Logo.png new file mode 100755 index 0000000000000000000000000000000000000000..c624b94d23b333e4cb2406ccc04c9599552e0bac GIT binary patch literal 14428 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 /etc/profile.d/clash.sh +# 检查并关闭系统托盘图标 +PID_NUM=`ps -ef | grep [y]ad | grep -i clash | wc -l` +PID=`ps -ef | grep [y]ad | grep -i clash | awk '{print $2}'` +if [ $PID_NUM -ne 0 ]; then + kill -9 $PID + echo -e "\n[INFO] 已移除系统托盘图标" +fi + echo -e "\n服务关闭成功,请执行以下命令关闭系统代理:proxy_off\n" diff --git a/start.sh b/start.sh index d6e584d..1cf339b 100644 --- a/start.sh +++ b/start.sh @@ -34,6 +34,9 @@ SKIP_DOWNLOAD_CONFIG=false # 初始化跳过编辑profile标志 SKIP_EDIT_PROFILE=false +# 初始化跳过系统托盘图标标志 +SKIP_TRAY_ICON=false + # 处理命令行参数 while [[ $# -gt 0 ]]; do case $1 in @@ -45,6 +48,10 @@ while [[ $# -gt 0 ]]; do SKIP_EDIT_PROFILE=true shift ;; + --skip-tray-icon) + SKIP_TRAY_ICON=true + shift + ;; *) echo "未知参数: $1" exit 1 @@ -55,6 +62,51 @@ done #################### 函数定义 #################### +# 检查依赖是否安装 +check_dependencies() { + if ! command -v yad &> /dev/null; then + echo -e "\033[33m[WARN] 未检测到 yad,尝试安装...\033[0m" + if command -v apt &> /dev/null; then + sudo apt update && sudo apt install -y yad + elif command -v yum &> /dev/null; then + sudo yum install -y yad + elif command -v dnf &> /dev/null; then + sudo dnf install -y yad + else + echo -e "\033[31m[ERROR] 无法安装 yad,请手动安装后重试\033[0m" + return 1 + fi + fi + return 0 +} + +# 启动系统托盘图标 +start_tray_icon() { + local icon_path="$Server_Dir/icon/Clash_Logo.png" + + # 检查图标文件是否存在 + if [ ! -f "$icon_path" ]; then + echo -e "\033[31m[ERROR] 未找到图标文件: $icon_path\033[0m" + return 1 + fi + + # 检查是否已有Clash托盘图标 + if ps -ef | grep -q "[y]ad.*clash"; then + echo -e "\n[INFO] 系统托盘图标已存在,跳过添加" + return 0 + fi + + # 启动系统托盘图标 + nohup yad --notification \ + --image="$icon_path" \ + --text="Clash" \ + --command="xdg-open http://127.0.0.1:9090/ui" \ + --no-middle \ + &> "$Log_Dir/tray.log" & + + echo -e "\n[INFO] 系统托盘图标已启动" +} + # 自定义action函数,实现通用action功能 success() { echo -en "\\033[60G[\\033[1;32m OK \\033[0;39m]\r" @@ -291,3 +343,12 @@ if [ "$SKIP_EDIT_PROFILE" = false ]; then else echo -e "\n[INFO] 跳过系统代理环境变量配置..." fi + +# 启动系统托盘图标 +if [ "$SKIP_TRAY_ICON" = false ]; then + if check_dependencies; then + start_tray_icon + fi +else + echo -e "\n[INFO] 跳过系统托盘图标启动..." +fi From 551f8c50a957a0ed8608ebf7d3b587b79acc489b Mon Sep 17 00:00:00 2001 From: zeyu10 Date: Thu, 8 May 2025 11:57:20 +0800 Subject: [PATCH 4/4] optimit start.sh, add --skip-download-config and --skip-edit-profile to skip procedures --- shutdown.sh | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/shutdown.sh b/shutdown.sh index 9644f31..ed46f88 100644 --- a/shutdown.sh +++ b/shutdown.sh @@ -1,5 +1,22 @@ #!/bin/bash +# 初始化跳过编辑profile标志 +SKIP_EDIT_PROFILE=false + +# 处理命令行参数 +while [[ $# -gt 0 ]]; do + case $1 in + --skip-edit-profile) + SKIP_EDIT_PROFILE=true + shift + ;; + *) + echo "未知参数: $1" + exit 1 + ;; + esac +done + # 关闭clash服务 PID_NUM=`ps -ef | grep [c]lash-linux-a | wc -l` PID=`ps -ef | grep [c]lash-linux-a | awk '{print $2}'` @@ -9,7 +26,13 @@ if [ $PID_NUM -ne 0 ]; then fi # 清除环境变量 -> /etc/profile.d/clash.sh +if [ "$SKIP_EDIT_PROFILE" = false ]; then + if [ "$(id -u)" -eq 0 ]; then + > /etc/profile.d/clash.sh + else + echo "错误:需要 root 权限才能修改 /etc/profile.d/clash.sh" >&2 + fi +fi # 检查并关闭系统托盘图标 PID_NUM=`ps -ef | grep [y]ad | grep -i clash | wc -l`