From 8feae1908023e1a310525dbd5cc9762bdc169d52 Mon Sep 17 00:00:00 2001 From: zyp Date: Sun, 31 Aug 2025 19:21:13 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=201.=20=E6=94=AF=E6=8C=81=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=9B=91=E5=90=AC=E5=9C=B0=E5=9D=80=202.=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=B8=8B=E8=BD=BD=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E8=AE=BE=E7=BD=AE=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 12 +++++++ start.sh | 67 ++++++++++++++++++++++++++++++++------- temp/templete_config.yaml | 10 +++--- 3 files changed, 72 insertions(+), 17 deletions(-) diff --git a/.env b/.env index 6159115..a249060 100644 --- a/.env +++ b/.env @@ -1,3 +1,15 @@ # Clash 订阅地址 export CLASH_URL='更改为你的clash订阅地址' export CLASH_SECRET='' +export CLASH_HEADERS='User-Agent: ClashforWindows/0.20.39' + +# Clash 监听配置 +export CLASH_HTTP_PORT=7890 +export CLASH_SOCKS_PORT=7891 +export CLASH_REDIR_PORT=7892 +export CLASH_LISTEN_IP=0.0.0.0 +export CLASH_ALLOW_LAN=true + +# External Controller (RESTful API) 配置 +export EXTERNAL_CONTROLLER_ENABLED=true +export EXTERNAL_CONTROLLER=0.0.0.0:9090 diff --git a/start.sh b/start.sh index d11dcb4..f1067c1 100644 --- a/start.sh +++ b/start.sh @@ -30,6 +30,15 @@ URL=${CLASH_URL:?Error: CLASH_URL variable is not set or empty} # 获取 CLASH_SECRET 值,如果不存在则生成一个随机数 Secret=${CLASH_SECRET:-$(openssl rand -hex 32)} +# 设置默认值 +CLASH_HTTP_PORT=${CLASH_HTTP_PORT:-7890} +CLASH_SOCKS_PORT=${CLASH_SOCKS_PORT:-7891} +CLASH_REDIR_PORT=${CLASH_REDIR_PORT:-7892} +CLASH_LISTEN_IP=${CLASH_LISTEN_IP:-0.0.0.0} +CLASH_ALLOW_LAN=${CLASH_ALLOW_LAN:-true} +EXTERNAL_CONTROLLER_ENABLED=${EXTERNAL_CONTROLLER_ENABLED:-true} +EXTERNAL_CONTROLLER=${EXTERNAL_CONTROLLER:-0.0.0.0:9090} + #################### 函数定义 #################### @@ -109,14 +118,27 @@ echo -e '\n正在下载Clash配置文件...' Text3="配置文件config.yaml下载成功!" Text4="配置文件config.yaml下载失败,退出启动!" +# 构建 curl 命令,添加自定义请求头 +CURL_CMD="curl -L -k -sS --retry 5 -m 10 -o $Temp_Dir/clash.yaml" +if [ -n "$CLASH_HEADERS" ]; then + CURL_CMD="$CURL_CMD -H '$CLASH_HEADERS'" +fi +CURL_CMD="$CURL_CMD $URL" + # 尝试使用curl进行下载 -curl -L -k -sS --retry 5 -m 10 -o $Temp_Dir/clash.yaml $URL +eval $CURL_CMD ReturnStatus=$? if [ $ReturnStatus -ne 0 ]; then # 如果使用curl下载失败,尝试使用wget进行下载 + WGET_CMD="wget -q --no-check-certificate -O $Temp_Dir/clash.yaml" + if [ -n "$CLASH_HEADERS" ]; then + WGET_CMD="$WGET_CMD --header='$CLASH_HEADERS'" + fi + WGET_CMD="$WGET_CMD $URL" + for i in {1..10} do - wget -q --no-check-certificate -O $Temp_Dir/clash.yaml $URL + eval $WGET_CMD ReturnStatus=$? if [ $ReturnStatus -eq 0 ]; then break @@ -144,15 +166,32 @@ fi #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 +# 合并形成新的config.yaml,并替换配置占位符 cat $Temp_Dir/templete_config.yaml > $Temp_Dir/config.yaml cat $Temp_Dir/proxy.txt >> $Temp_Dir/config.yaml + +# 替换配置文件中的占位符为环境变量值 +sed -i "s/CLASH_HTTP_PORT_PLACEHOLDER/${CLASH_HTTP_PORT}/g" $Temp_Dir/config.yaml +sed -i "s/CLASH_SOCKS_PORT_PLACEHOLDER/${CLASH_SOCKS_PORT}/g" $Temp_Dir/config.yaml +sed -i "s/CLASH_REDIR_PORT_PLACEHOLDER/${CLASH_REDIR_PORT}/g" $Temp_Dir/config.yaml +sed -i "s/CLASH_ALLOW_LAN_PLACEHOLDER/${CLASH_ALLOW_LAN}/g" $Temp_Dir/config.yaml + +# 配置 external-controller +if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then + sed -i "s/EXTERNAL_CONTROLLER_PLACEHOLDER/${EXTERNAL_CONTROLLER}/g" $Temp_Dir/config.yaml +else + # 如果禁用 external-controller,则注释掉该行 + sed -i "s/external-controller: 'EXTERNAL_CONTROLLER_PLACEHOLDER'/# external-controller: disabled/g" $Temp_Dir/config.yaml +fi + \cp $Temp_Dir/config.yaml $Conf_Dir/ # Configure Clash Dashboard Work_Dir=$(cd $(dirname $0); pwd) Dashboard_Dir="${Work_Dir}/dashboard/public" -sed -ri "s@^# external-ui:.*@external-ui: ${Dashboard_Dir}@g" $Conf_Dir/config.yaml +if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then + sed -ri "s@^# external-ui:.*@external-ui: ${Dashboard_Dir}@g" $Conf_Dir/config.yaml +fi sed -r -i '/^secret: /s@(secret: ).*@\1'${Secret}'@g' $Conf_Dir/config.yaml @@ -179,19 +218,23 @@ fi # Output Dashboard access address and Secret echo '' -echo -e "Clash Dashboard 访问地址: http://:9090/ui" -echo -e "Secret: ${Secret}" +if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then + echo -e "Clash Dashboard 访问地址: http://${EXTERNAL_CONTROLLER}/ui" + echo -e "Secret: ${Secret}" +else + echo -e "External Controller (Dashboard) 已禁用" +fi echo '' -# 添加环境变量(root权限) +# 添加环境变量(root权限) - 使用配置的端口 cat>/etc/profile.d/clash.sh< Date: Sun, 31 Aug 2025 19:32:38 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=201.=20=E6=94=AF=E6=8C=81=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=9B=91=E5=90=AC=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- start.sh | 13 +++++++++++-- temp/templete_config.yaml | 3 +++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/start.sh b/start.sh index f1067c1..24709d1 100644 --- a/start.sh +++ b/start.sh @@ -108,8 +108,16 @@ unset NO_PROXY echo -e '\n正在检测订阅地址...' Text1="Clash订阅地址可访问!" Text2="Clash订阅地址不可访问!" -#curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} $URL | grep '[23][0-9][0-9]' &>/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 + +# 构建检测 curl 命令,添加自定义请求头 +CHECK_CMD="curl -o /dev/null -L -k -sS --retry 5 -m 10 --connect-timeout 10 -w \"%{http_code}\"" +if [ -n "$CLASH_HEADERS" ]; then + CHECK_CMD="$CHECK_CMD -H '$CLASH_HEADERS'" +fi +CHECK_CMD="$CHECK_CMD $URL" + +# 检查订阅地址 +eval $CHECK_CMD | grep -E '^[23][0-9]{2}$' &>/dev/null ReturnStatus=$? if_success $Text1 $Text2 $ReturnStatus @@ -174,6 +182,7 @@ cat $Temp_Dir/proxy.txt >> $Temp_Dir/config.yaml sed -i "s/CLASH_HTTP_PORT_PLACEHOLDER/${CLASH_HTTP_PORT}/g" $Temp_Dir/config.yaml sed -i "s/CLASH_SOCKS_PORT_PLACEHOLDER/${CLASH_SOCKS_PORT}/g" $Temp_Dir/config.yaml sed -i "s/CLASH_REDIR_PORT_PLACEHOLDER/${CLASH_REDIR_PORT}/g" $Temp_Dir/config.yaml +sed -i "s/CLASH_LISTEN_IP_PLACEHOLDER/${CLASH_LISTEN_IP}/g" $Temp_Dir/config.yaml sed -i "s/CLASH_ALLOW_LAN_PLACEHOLDER/${CLASH_ALLOW_LAN}/g" $Temp_Dir/config.yaml # 配置 external-controller diff --git a/temp/templete_config.yaml b/temp/templete_config.yaml index e582315..0b57ae4 100644 --- a/temp/templete_config.yaml +++ b/temp/templete_config.yaml @@ -7,6 +7,9 @@ socks-port: CLASH_SOCKS_PORT_PLACEHOLDER # Linux 和 macOS 的 redir 代理端口 redir-port: CLASH_REDIR_PORT_PLACEHOLDER +# 监听IP地址 +bind-address: CLASH_LISTEN_IP_PLACEHOLDER + # 允许局域网的连接 allow-lan: CLASH_ALLOW_LAN_PLACEHOLDER