mirror of
https://github.com/fscarmen/sing-box.git
synced 2026-08-10 17:55:16 +08:00
v1.3.7 Enhance Hysteria2 with post-installation port hopping and bandwidth configuration
- Add support for enabling/disabling Hysteria2 port hopping and modifying port ranges after installation - Allow customization of Hysteria2 upload/download bandwidth without reinstalling - Enhance client configuration with proper Hysteria2 bandwidth (up/down) and port hopping parameters - Improve port range input validation with automatic separator normalization - Simplify menu option 9 description to "Change node configuration 增强 Hysteria2,支持安装后配置及客户端参数完善 - 支持安装后启用/禁用 Hysteria2 端口跳跃,并可修改端口范围 - 支持自定义 Hysteria2 上下行带宽,无需重新安装 - 完善客户端配置,补充 Hysteria2 上传/下载速率及端口跳跃参数 - 改进端口范围输入校验,自动规范分隔符格式 - 简化菜单选项 9 描述为“修改节点配置”
This commit is contained in:
@@ -24,6 +24,8 @@
|
|||||||
|
|
||||||
* * *
|
* * *
|
||||||
## 1.更新信息
|
## 1.更新信息
|
||||||
|
2026.04.09 v1.3.6 1. Add support for enabling/disabling Hysteria2 port hopping and modifying port ranges after installation (sb -d); 2. Allow customization of Hysteria2 upload/download bandwidth without reinstalling; 3. Enhance client configuration with proper Hysteria2 bandwidth (up/down) and port hopping parameters; 1. 支持安装后启用/禁用 Hysteria2 端口跳跃,并可修改端口范围 (sb -d); 2. 支持自定义 Hysteria2 上下行带宽,无需重新安装; 3. 完善客户端配置,补充 Hysteria2 上传/下载速率及端口跳跃参数
|
||||||
|
|
||||||
2026.03.22 v1.3.6 1. Refactor: Support modification after installation (CDN, Reality SNI, node name, UUID/password, server IP); 2. Perf: Rewrite text() with bash nameref and pre-scanned TEXT_NEEDS_EVAL map to eliminate per-call grep subprocesses, significantly reducing repeated string-lookup overhead; 1. 重构:支持安装后多项修改(CDN、Reality SNI、节点名、UUID/密码、服务器 IP);2. 性能优化:用 bash nameref 和预扫描 TEXT_NEEDS_EVAL 关联数组重写 text() 函数,消除每次调用产生的 grep 子进程,大幅降低字符串查找开销
|
2026.03.22 v1.3.6 1. Refactor: Support modification after installation (CDN, Reality SNI, node name, UUID/password, server IP); 2. Perf: Rewrite text() with bash nameref and pre-scanned TEXT_NEEDS_EVAL map to eliminate per-call grep subprocesses, significantly reducing repeated string-lookup overhead; 1. 重构:支持安装后多项修改(CDN、Reality SNI、节点名、UUID/密码、服务器 IP);2. 性能优化:用 bash nameref 和预扫描 TEXT_NEEDS_EVAL 关联数组重写 text() 函数,消除每次调用产生的 grep 子进程,大幅降低字符串查找开销
|
||||||
|
|
||||||
2026.03.14 v1.3.5 Performance: Optimize concurrent process execution to significantly accelerate script installation. 性能优化:优化并发进程执行,大幅提升脚本安装速度
|
2026.03.14 v1.3.5 Performance: Optimize concurrent process execution to significantly accelerate script installation. 性能优化:优化并发进程执行,大幅提升脚本安装速度
|
||||||
|
|||||||
+147
-27
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# 当前脚本版本号
|
# 当前脚本版本号
|
||||||
VERSION='v1.3.6 (2026.03.22)'
|
VERSION='v1.3.7 (2026.04.09)'
|
||||||
|
|
||||||
# Github 反代加速代理
|
# Github 反代加速代理
|
||||||
GITHUB_PROXY=('https://hub.glowp.xyz/' 'https://proxy.vvvv.ee/')
|
GITHUB_PROXY=('https://hub.glowp.xyz/' 'https://proxy.vvvv.ee/')
|
||||||
@@ -43,8 +43,8 @@ mkdir -p "$TEMP_DIR"
|
|||||||
|
|
||||||
E[0]="Language:\n 1. English (default) \n 2. 简体中文"
|
E[0]="Language:\n 1. English (default) \n 2. 简体中文"
|
||||||
C[0]="${E[0]}"
|
C[0]="${E[0]}"
|
||||||
E[1]="1. Refactor: Support modification after installation (CDN, Reality SNI, node name, UUID/password, server IP); 2. Perf: Rewrite text(), significantly reducing repeated string-lookup overhead"
|
E[1]="1. Add support for enabling/disabling Hysteria2 port hopping and modifying port ranges after installation (sb -d); 2. Allow customization of Hysteria2 upload/download bandwidth without reinstalling; 3. Enhance client configuration with proper Hysteria2 bandwidth (up/down) and port hopping parameters"
|
||||||
C[1]="1. 重构:支持安装后多项修改(CDN、Reality SNI、节点名、UUID/密码、服务器 IP);2. 性能优化:重写 text() 函数,大幅降低字符串查找开销"
|
C[1]="1. 支持安装后启用/禁用 Hysteria2 端口跳跃,并可修改端口范围 (sb -d); 2. 支持自定义 Hysteria2 上下行带宽,无需重新安装; 3. 完善客户端配置,补充 Hysteria2 上传/下载速率及端口跳跃参数"
|
||||||
E[2]="Downloading Sing-box. Please wait a seconds ..."
|
E[2]="Downloading Sing-box. Please wait a seconds ..."
|
||||||
C[2]="下载 Sing-box 中,请稍等 ..."
|
C[2]="下载 Sing-box 中,请稍等 ..."
|
||||||
E[3]="Input errors up to 5 times.The script is aborted."
|
E[3]="Input errors up to 5 times.The script is aborted."
|
||||||
@@ -283,8 +283,8 @@ E[119]="Using Cloudflare API to create Tunnel and handle DNS config..."
|
|||||||
C[119]="使用 Cloudflare API 创建 Tunnel 和处理 DNS 配置..."
|
C[119]="使用 Cloudflare API 创建 Tunnel 和处理 DNS 配置..."
|
||||||
E[120]="Found existing tunnel with the same name. Tunnel ID: \$EXISTING_TUNNEL_ID. Status: \$EXISTING_TUNNEL_STATUS. Overwrite? [y/N] (default y):"
|
E[120]="Found existing tunnel with the same name. Tunnel ID: \$EXISTING_TUNNEL_ID. Status: \$EXISTING_TUNNEL_STATUS. Overwrite? [y/N] (default y):"
|
||||||
C[120]="发现同名隧道已创建,隧道 ID: \$EXISTING_TUNNEL_ID,状态: \$EXISTING_TUNNEL_STATUS。是否覆盖? [y/N] (默认为 y):"
|
C[120]="发现同名隧道已创建,隧道 ID: \$EXISTING_TUNNEL_ID,状态: \$EXISTING_TUNNEL_STATUS。是否覆盖? [y/N] (默认为 y):"
|
||||||
E[121]="Change preferred domain / TLS SNI / node info (sb -d)"
|
E[121]="Change node configuration (sb -d)"
|
||||||
C[121]="更换优选域名 / TLS SNI / 节点信息 (sb -d)"
|
C[121]="修改节点配置 (sb -d)"
|
||||||
E[122]="Invalid access token. Please roll at https://dash.cloudflare.com/profile/api-tokens to re-generate."
|
E[122]="Invalid access token. Please roll at https://dash.cloudflare.com/profile/api-tokens to re-generate."
|
||||||
C[122]="Token 访问令牌无效。请在 https://dash.cloudflare.com/profile/api-tokens 轮转,以重新获取"
|
C[122]="Token 访问令牌无效。请在 https://dash.cloudflare.com/profile/api-tokens 轮转,以重新获取"
|
||||||
E[123]="Token zone resource failed. The tunnel root domain and the authorized domain of the token are inconsistent. Please go to https://dash.cloudflare.com/profile/api-tokens to re-authorize."
|
E[123]="Token zone resource failed. The tunnel root domain and the authorized domain of the token are inconsistent. Please go to https://dash.cloudflare.com/profile/api-tokens to re-authorize."
|
||||||
@@ -319,6 +319,16 @@ E[137]="Uninstalled protocols."
|
|||||||
C[137]="未安装的协议"
|
C[137]="未安装的协议"
|
||||||
E[138]="Confirm all protocols for reloading."
|
E[138]="Confirm all protocols for reloading."
|
||||||
C[138]="确认重装的所有协议"
|
C[138]="确认重装的所有协议"
|
||||||
|
E[139]="Hysteria2 Port Hopping (current: \${PORT_HOPPING_RANGE:-disabled}) [leave blank to disable]"
|
||||||
|
C[139]="Hysteria2 端口跳跃 (当前: \${PORT_HOPPING_RANGE:-禁用}) [留空则禁用]"
|
||||||
|
E[140]="Hysteria2 bandwidth (current: up \${HY2_UP_NOW} Mbps, down \${HY2_DOWN_NOW} Mbps)"
|
||||||
|
C[140]="Hysteria2 带宽 (当前: 上行 \${HY2_UP_NOW} Mbps, 下行 \${HY2_DOWN_NOW} Mbps)"
|
||||||
|
E[141]="Please enter Hysteria2 client upload speed in Mbps (e.g. 200):"
|
||||||
|
C[141]="请输入 Hysteria2 客户端上行速率 Mbps(纯数字,如 200):"
|
||||||
|
E[142]="Please enter Hysteria2 client download speed in Mbps (e.g. 1000):"
|
||||||
|
C[142]="请输入 Hysteria2 客户端下行速率 Mbps(纯数字,如 1000):"
|
||||||
|
E[143]="Invalid input, please enter a positive integer."
|
||||||
|
C[143]="输入无效,请输入正整数。"
|
||||||
|
|
||||||
# 自定义字体彩色,read 函数
|
# 自定义字体彩色,read 函数
|
||||||
warning() { echo -e "\033[31m\033[01m$*\033[0m"; } # 红色
|
warning() { echo -e "\033[31m\033[01m$*\033[0m"; } # 红色
|
||||||
@@ -326,6 +336,7 @@ error() { echo -e "\033[31m\033[01m$*\033[0m" && exit 1; } # 红色
|
|||||||
info() { echo -e "\033[32m\033[01m$*\033[0m"; } # 绿色
|
info() { echo -e "\033[32m\033[01m$*\033[0m"; } # 绿色
|
||||||
hint() { echo -e "\033[33m\033[01m$*\033[0m"; } # 黄色
|
hint() { echo -e "\033[33m\033[01m$*\033[0m"; } # 黄色
|
||||||
reading() { read -rp "$(info "$1")" "$2"; }
|
reading() { read -rp "$(info "$1")" "$2"; }
|
||||||
|
|
||||||
# 预处理:扫描 E/C 数组,把含 $ 的条目下标记录到关联数组,避免 text() 每次调用都启动 grep 子进程
|
# 预处理:扫描 E/C 数组,把含 $ 的条目下标记录到关联数组,避免 text() 每次调用都启动 grep 子进程
|
||||||
declare -A TEXT_NEEDS_EVAL
|
declare -A TEXT_NEEDS_EVAL
|
||||||
for _text_i in "${!E[@]}"; do
|
for _text_i in "${!E[@]}"; do
|
||||||
@@ -490,7 +501,7 @@ input_cdn() {
|
|||||||
hint " $(( c+1 )). ${CDN_DOMAIN[c]} "
|
hint " $(( c+1 )). ${CDN_DOMAIN[c]} "
|
||||||
done
|
done
|
||||||
|
|
||||||
reading "\n (${STEP_NUM}/${TOTAL_STEPS}) $(text 53) " CUSTOM_CDN
|
reading "\n ${TOTAL_STEPS:+(${STEP_NUM}/${TOTAL_STEPS}) }$(text 53) " CUSTOM_CDN
|
||||||
case "$CUSTOM_CDN" in
|
case "$CUSTOM_CDN" in
|
||||||
[1-${#CDN_DOMAIN[@]}] )
|
[1-${#CDN_DOMAIN[@]}] )
|
||||||
CDN="${CDN_DOMAIN[$((CUSTOM_CDN-1))]}"
|
CDN="${CDN_DOMAIN[$((CUSTOM_CDN-1))]}"
|
||||||
@@ -527,6 +538,25 @@ change_config() {
|
|||||||
ls ${WORK_DIR}/conf/*-ws*inbounds.json >/dev/null 2>&1 && local SERVER_IP_NOW=$(awk -F '"' '/"WS_SERVER_IP_SHOW"/{print $4; exit}' ${WORK_DIR}/conf/*-ws*inbounds.json) || local SERVER_IP_NOW=$(grep -A1 '"tag"' ${WORK_DIR}/list | sed -E '/-ws(-tls)*",$/{N;d}' | awk -F '"' '/"server"/{count++; if (count == 1) {print $4; exit}}')
|
ls ${WORK_DIR}/conf/*-ws*inbounds.json >/dev/null 2>&1 && local SERVER_IP_NOW=$(awk -F '"' '/"WS_SERVER_IP_SHOW"/{print $4; exit}' ${WORK_DIR}/conf/*-ws*inbounds.json) || local SERVER_IP_NOW=$(grep -A1 '"tag"' ${WORK_DIR}/list | sed -E '/-ws(-tls)*",$/{N;d}' | awk -F '"' '/"server"/{count++; if (count == 1) {print $4; exit}}')
|
||||||
[ -n "$SERVER_IP_NOW" ] && MENU_IDX+=(132) && MENU_KEY+=(serverip) && MENU_VAL+=("$SERVER_IP_NOW")
|
[ -n "$SERVER_IP_NOW" ] && MENU_IDX+=(132) && MENU_KEY+=(serverip) && MENU_VAL+=("$SERVER_IP_NOW")
|
||||||
|
|
||||||
|
# Hysteria2 带宽和端口跳跃(仅在 Hysteria2 已安装时显示)
|
||||||
|
if ls ${WORK_DIR}/conf/*_${NODE_TAG[1]}_inbounds.json 2>&1; then
|
||||||
|
local HY2_LINE=$(grep 'type: hysteria2' ${WORK_DIR}/subscribe/proxies)
|
||||||
|
if [[ "$HY2_LINE" =~ up:[[:space:]]*\"([0-9]+)[[:space:]]*Mbps\".*down:[[:space:]]*\"([0-9]+)[[:space:]]*Mbps\" ]]; then
|
||||||
|
HY2_UP_NOW="${BASH_REMATCH[1]}"
|
||||||
|
HY2_DOWN_NOW="${BASH_REMATCH[2]}"
|
||||||
|
elif [[ "$HY2_LINE" =~ down:[[:space:]]*\"([0-9]+)[[:space:]]*Mbps\".*up:[[:space:]]*\"([0-9]+)[[:space:]]*Mbps\" ]]; then
|
||||||
|
HY2_DOWN_NOW="${BASH_REMATCH[1]}"
|
||||||
|
HY2_UP_NOW="${BASH_REMATCH[2]}"
|
||||||
|
fi
|
||||||
|
HY2_UP_NOW=${HY2_UP_NOW:-200}
|
||||||
|
HY2_DOWN_NOW=${HY2_DOWN_NOW:-1000}
|
||||||
|
|
||||||
|
MENU_IDX+=(140) && MENU_KEY+=(hy2bw) && MENU_VAL+=("${HY2_UP_NOW}/${HY2_DOWN_NOW}")
|
||||||
|
|
||||||
|
check_port_hopping_nat
|
||||||
|
MENU_IDX+=(139) && MENU_KEY+=(hy2hopping) && MENU_VAL+=("${PORT_HOPPING_RANGE}")
|
||||||
|
fi
|
||||||
|
|
||||||
[ "${#MENU_IDX[@]}" -eq 0 ] && error " $(text 110) "
|
[ "${#MENU_IDX[@]}" -eq 0 ] && error " $(text 110) "
|
||||||
|
|
||||||
# 显示动态菜单
|
# 显示动态菜单
|
||||||
@@ -550,6 +580,76 @@ change_config() {
|
|||||||
local KEY="${MENU_KEY[IDX]}"
|
local KEY="${MENU_KEY[IDX]}"
|
||||||
local OLD="${MENU_VAL[IDX]}"
|
local OLD="${MENU_VAL[IDX]}"
|
||||||
|
|
||||||
|
# 特殊操作路由(不走通用替换逻辑)
|
||||||
|
if [ "$KEY" = "hy2bw" ]; then
|
||||||
|
# 修改 Hysteria2 带宽 - 内联实现
|
||||||
|
local HY2_UP HY2_DOWN
|
||||||
|
while true; do
|
||||||
|
reading " $(text 141) " HY2_UP
|
||||||
|
[[ "$HY2_UP" =~ ^[1-9][0-9]*$ ]] && break
|
||||||
|
warning " $(text 143) "
|
||||||
|
done
|
||||||
|
while true; do
|
||||||
|
reading " $(text 142) " HY2_DOWN
|
||||||
|
[[ "$HY2_DOWN" =~ ^[1-9][0-9]*$ ]] && break
|
||||||
|
warning " $(text 143) "
|
||||||
|
done
|
||||||
|
sed -i -E "s/(up: \")([0-9]+)( Mbps\")/\1${HY2_UP}\3/g; s/(down: \")([0-9]+)( Mbps\")/\1${HY2_DOWN}\3/g" ${WORK_DIR}/subscribe/proxies
|
||||||
|
hint " $(text 112) "
|
||||||
|
export_list
|
||||||
|
return
|
||||||
|
elif [ "$KEY" = "hy2hopping" ]; then
|
||||||
|
# 修改 Hysteria2 端口跳跃 - 内联实现
|
||||||
|
check_port_hopping_nat
|
||||||
|
local OLD_START="$PORT_HOPPING_START" OLD_END="$PORT_HOPPING_END"
|
||||||
|
hint "\n $(text 97) \n"
|
||||||
|
|
||||||
|
local HOPPING_ERROR_TIME=6
|
||||||
|
local NEW_RANGE=""
|
||||||
|
until [ -n "$IS_HOPPING_SET" ]; do
|
||||||
|
if [ -z "$NEW_RANGE" ]; then
|
||||||
|
(( HOPPING_ERROR_TIME-- )) || true
|
||||||
|
case "$HOPPING_ERROR_TIME" in
|
||||||
|
0 ) error "\n $(text 3) \n" ;;
|
||||||
|
5 ) reading " $(text 98) " NEW_RANGE ;;
|
||||||
|
* ) reading " $(text 98) " NEW_RANGE ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 预处理:将所有分隔符统一为冒号,过滤非法字符
|
||||||
|
NEW_RANGE=$(sed 's/[--—:]/:/g' <<< "$NEW_RANGE" | tr -cd '0-9:')
|
||||||
|
|
||||||
|
if [[ -z "$NEW_RANGE" || "${NEW_RANGE,,}" =~ ^(n|no)$ ]]; then
|
||||||
|
# 禁用端口跳跃
|
||||||
|
[ -n "$OLD_START" ] && [ -n "$OLD_END" ] && del_port_hopping_nat
|
||||||
|
unset PORT_HOPPING_START PORT_HOPPING_END PORT_HOPPING_RANGE
|
||||||
|
IS_HOPPING_SET=true
|
||||||
|
elif [[ "$NEW_RANGE" =~ ^[0-9]{4,5}:[0-9]{4,5}$ ]]; then
|
||||||
|
local NEW_START=${NEW_RANGE%:*} NEW_END=${NEW_RANGE#*:}
|
||||||
|
if [[ "$NEW_START" -lt "$NEW_END" && "$NEW_START" -ge "$MIN_HOPPING_PORT" && "$NEW_END" -le "$MAX_HOPPING_PORT" ]]; then
|
||||||
|
# 删除旧规则,添加新规则
|
||||||
|
[ -n "$OLD_START" ] && [ -n "$OLD_END" ] && del_port_hopping_nat
|
||||||
|
PORT_HOPPING_START=$NEW_START
|
||||||
|
PORT_HOPPING_END=$NEW_END
|
||||||
|
PORT_HOPPING_RANGE="$NEW_RANGE"
|
||||||
|
local HOPPING_TARGET="$PORT_HOPPING_TARGET"
|
||||||
|
[ -z "$HOPPING_TARGET" ] && HOPPING_TARGET=$(awk -F '[:,]' '/"listen_port"/{print $2; exit}' ${WORK_DIR}/conf/*_${NODE_TAG[1]}_inbounds.json 2>/dev/null)
|
||||||
|
add_port_hopping_nat "$PORT_HOPPING_START" "$PORT_HOPPING_END" "$HOPPING_TARGET"
|
||||||
|
IS_HOPPING_SET=true
|
||||||
|
else
|
||||||
|
warning "\n $(text 36) " && unset NEW_RANGE
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warning "\n $(text 36) " && unset NEW_RANGE
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
hint " $(text 112) "
|
||||||
|
export_list
|
||||||
|
info " $(text 37) "
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
hint ""
|
hint ""
|
||||||
reading " $(text 134) " NEW_VAL
|
reading " $(text 134) " NEW_VAL
|
||||||
[ -z "$NEW_VAL" ] && info " $(text 135) " && return
|
[ -z "$NEW_VAL" ] && info " $(text 135) " && return
|
||||||
@@ -790,7 +890,7 @@ input_nginx_port() {
|
|||||||
if [ "$PORT_ERROR_TIME" = 0 ]; then
|
if [ "$PORT_ERROR_TIME" = 0 ]; then
|
||||||
error "\n $(text 3) \n"
|
error "\n $(text 3) \n"
|
||||||
else
|
else
|
||||||
[ -z "$PORT_NGINX" ] && reading "\n (${STEP_NUM}/${TOTAL_STEPS}) $(text 79) " PORT_NGINX
|
[ -z "$PORT_NGINX" ] && reading "\n ${TOTAL_STEPS:+(${STEP_NUM}/${TOTAL_STEPS}) }$(text 79) " PORT_NGINX
|
||||||
fi
|
fi
|
||||||
PORT_NGINX=${PORT_NGINX:-"$PORT_NGINX_DEFAULT"}
|
PORT_NGINX=${PORT_NGINX:-"$PORT_NGINX_DEFAULT"}
|
||||||
if [[ "$PORT_NGINX" =~ ^[1-9][0-9]{1,4}$ && "$PORT_NGINX" -ge "$MIN_PORT" && "$PORT_NGINX" -le "$MAX_PORT" ]]; then
|
if [[ "$PORT_NGINX" =~ ^[1-9][0-9]{1,4}$ && "$PORT_NGINX" -ge "$MIN_PORT" && "$PORT_NGINX" -le "$MAX_PORT" ]]; then
|
||||||
@@ -810,29 +910,37 @@ input_hopping_port() {
|
|||||||
error "\n $(text 3) \n"
|
error "\n $(text 3) \n"
|
||||||
;;
|
;;
|
||||||
5 )
|
5 )
|
||||||
hint "\n $(text 97) \n" && reading " (${STEP_NUM}/${TOTAL_STEPS}) $(text 98) " PORT_HOPPING_RANGE
|
hint "\n $(text 97) \n" && reading " ${TOTAL_STEPS:+(${STEP_NUM}/${TOTAL_STEPS}) }$(text 98) " PORT_HOPPING_RANGE
|
||||||
;;
|
;;
|
||||||
* )
|
* )
|
||||||
reading " (${STEP_NUM}/${TOTAL_STEPS}) $(text 98) " PORT_HOPPING_RANGE
|
reading " ${TOTAL_STEPS:+(${STEP_NUM}/${TOTAL_STEPS}) }$(text 98) " PORT_HOPPING_RANGE
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
if [[ "${PORT_HOPPING_RANGE//-/:}" =~ ^[1-6][0-9]{4}:[1-6][0-9]{4}$ ]]; then
|
|
||||||
# 为防止输入错误,把 - 改为 : ,比如 10000-11000 改为 10000:11000
|
# 预处理:全角冒号/破折号统一换半角,过滤非法字符
|
||||||
PORT_HOPPING_RANGE=${PORT_HOPPING_RANGE//-/:}
|
PORT_HOPPING_RANGE=$(sed 's/[--—:]/:/g' <<< "$PORT_HOPPING_RANGE" | tr -cd '0-9:')
|
||||||
|
|
||||||
|
if [[ "$PORT_HOPPING_RANGE" =~ ^[0-9]{4,5}:[0-9]{4,5}$ ]]; then
|
||||||
PORT_HOPPING_START=${PORT_HOPPING_RANGE%:*}
|
PORT_HOPPING_START=${PORT_HOPPING_RANGE%:*}
|
||||||
PORT_HOPPING_END=${PORT_HOPPING_RANGE#*:}
|
PORT_HOPPING_END=${PORT_HOPPING_RANGE#*:}
|
||||||
[[ "$PORT_HOPPING_START" -lt "$PORT_HOPPING_END" && "$PORT_HOPPING_START" -ge "$MIN_HOPPING_PORT" && "$PORT_HOPPING_END" -le "$MAX_HOPPING_PORT" ]] && IS_HOPPING=is_hopping || warning "\n $(text 36) "
|
if [[ "$PORT_HOPPING_START" -lt "$PORT_HOPPING_END" && \
|
||||||
|
"$PORT_HOPPING_START" -ge "$MIN_HOPPING_PORT" && \
|
||||||
|
"$PORT_HOPPING_END" -le "$MAX_HOPPING_PORT" ]]; then
|
||||||
|
IS_HOPPING=is_hopping
|
||||||
|
else
|
||||||
|
warning "\n $(text 114) " && unset PORT_HOPPING_RANGE
|
||||||
|
fi
|
||||||
elif [[ -z "$PORT_HOPPING_RANGE" || "${PORT_HOPPING_RANGE,,}" =~ ^(n|no)$ ]]; then
|
elif [[ -z "$PORT_HOPPING_RANGE" || "${PORT_HOPPING_RANGE,,}" =~ ^(n|no)$ ]]; then
|
||||||
IS_HOPPING=no_hopping
|
IS_HOPPING=no_hopping
|
||||||
else
|
else
|
||||||
warning "\n $(text 36) "
|
warning "\n $(text 36) " && unset PORT_HOPPING_RANGE
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
# 输入 Reality 密钥
|
# 输入 Reality 密钥
|
||||||
input_reality_key() {
|
input_reality_key() {
|
||||||
[[ "$NONINTERACTIVE_INSTALL" != 'noninteractive_install' && "$IS_FAST_INSTALL" != 'is_fast_install' ]] && [ -z "$REALITY_PRIVATE" ] && reading "\n (${STEP_NUM}/${TOTAL_STEPS}) $(text 70) " REALITY_PRIVATE
|
[[ "$NONINTERACTIVE_INSTALL" != 'noninteractive_install' && "$IS_FAST_INSTALL" != 'is_fast_install' ]] && [ -z "$REALITY_PRIVATE" ] && reading "\n ${TOTAL_STEPS:+(${STEP_NUM}/${TOTAL_STEPS}) }$(text 70) " REALITY_PRIVATE
|
||||||
[ -z "$REALITY_PRIVATE" ] && unset REALITY_PRIVATE && return
|
[ -z "$REALITY_PRIVATE" ] && unset REALITY_PRIVATE && return
|
||||||
|
|
||||||
local PRIVATEKEY_ERROR_TIME=5
|
local PRIVATEKEY_ERROR_TIME=5
|
||||||
@@ -861,7 +969,7 @@ input_argo_auth() {
|
|||||||
[ -n "$IS_CHANGE_ARGO" ] && ARGO_DOMAIN=$(sed 's/[ ]*//g; s/:[ ]*//' <<< "$ARGO_DOMAIN")
|
[ -n "$IS_CHANGE_ARGO" ] && ARGO_DOMAIN=$(sed 's/[ ]*//g; s/:[ ]*//' <<< "$ARGO_DOMAIN")
|
||||||
done
|
done
|
||||||
elif [[ "$NONINTERACTIVE_INSTALL" != 'noninteractive_install' && "$IS_FAST_INSTALL" != 'is_fast_install' ]]; then
|
elif [[ "$NONINTERACTIVE_INSTALL" != 'noninteractive_install' && "$IS_FAST_INSTALL" != 'is_fast_install' ]]; then
|
||||||
[ -z "$ARGO_DOMAIN" ] && reading "\n (${STEP_NUM}/${TOTAL_STEPS}) $(text 87) " ARGO_DOMAIN
|
[ -z "$ARGO_DOMAIN" ] && reading "\n ${TOTAL_STEPS:+(${STEP_NUM}/${TOTAL_STEPS}) }$(text 87) " ARGO_DOMAIN
|
||||||
ARGO_DOMAIN=$(sed 's/[ ]*//g; s/:[ ]*//' <<< "$ARGO_DOMAIN")
|
ARGO_DOMAIN=$(sed 's/[ ]*//g; s/:[ ]*//' <<< "$ARGO_DOMAIN")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -2950,8 +3058,10 @@ export_list() {
|
|||||||
$CLASH_XTLS_REALITY
|
$CLASH_XTLS_REALITY
|
||||||
"
|
"
|
||||||
if [ -n "$PORT_HYSTERIA2" ]; then
|
if [ -n "$PORT_HYSTERIA2" ]; then
|
||||||
[[ -n "$PORT_HOPPING_START" && -n "$PORT_HOPPING_END" ]] && local CLASH_HOPPING=" ports: ${PORT_HOPPING_START}-${PORT_HOPPING_END}, HopInterval: 60,"
|
[[ -n "$PORT_HOPPING_START" && -n "$PORT_HOPPING_END" ]] && local CLASH_HOPPING=" ports: ${PORT_HOPPING_START}-${PORT_HOPPING_END}, hop-interval: 30,"
|
||||||
local CLASH_HYSTERIA2="- {name: \"${NODE_NAME[12]} ${NODE_TAG[1]}\", type: hysteria2, server: ${SERVER_IP}, port: ${PORT_HYSTERIA2},${CLASH_HOPPING} up: \"200 Mbps\", down: \"1000 Mbps\", password: ${UUID[12]}, sni: ${TLS_SERVER}, skip-cert-verify: false, fingerprint: ${SELF_SIGNED_FINGERPRINT_SHA256}}" &&
|
local HY2_UP=${HY2_UP:-200}
|
||||||
|
local HY2_DOWN=${HY2_DOWN:-1000}
|
||||||
|
local CLASH_HYSTERIA2="- {name: \"${NODE_NAME[12]} ${NODE_TAG[1]}\", type: hysteria2, server: ${SERVER_IP}, port: ${PORT_HYSTERIA2},${CLASH_HOPPING} up: \"${HY2_UP} Mbps\", down: \"${HY2_DOWN} Mbps\", password: ${UUID[12]}, sni: ${TLS_SERVER}, skip-cert-verify: false, fingerprint: ${SELF_SIGNED_FINGERPRINT_SHA256}}" &&
|
||||||
local CLASH_SUBSCRIBE+="
|
local CLASH_SUBSCRIBE+="
|
||||||
$CLASH_HYSTERIA2
|
$CLASH_HYSTERIA2
|
||||||
"
|
"
|
||||||
@@ -3055,9 +3165,10 @@ export_list() {
|
|||||||
vless://$(echo -n "auto:${UUID[11]}@${SERVER_IP_2}:${PORT_XTLS_REALITY}" | base64 -w0)?remarks=${NODE_NAME[11]// /%20}%20${NODE_TAG[0]}&tls=1&peer=${TLS_SERVER}&${VISION_OR_MUX_SHADOWROCKET}&pbk=${REALITY_PUBLIC[11]}
|
vless://$(echo -n "auto:${UUID[11]}@${SERVER_IP_2}:${PORT_XTLS_REALITY}" | base64 -w0)?remarks=${NODE_NAME[11]// /%20}%20${NODE_TAG[0]}&tls=1&peer=${TLS_SERVER}&${VISION_OR_MUX_SHADOWROCKET}&pbk=${REALITY_PUBLIC[11]}
|
||||||
"
|
"
|
||||||
if [ -n "$PORT_HYSTERIA2" ]; then
|
if [ -n "$PORT_HYSTERIA2" ]; then
|
||||||
[[ -n "$PORT_HOPPING_START" && -n "$PORT_HOPPING_END" ]] && local SHADOWROCKET_HOPPING="&mport=${PORT_HYSTERIA2},${PORT_HOPPING_START}-${PORT_HOPPING_END}"
|
local SHADOWROCKET_PARAMS="peer=${TLS_SERVER}&hpkp=${SELF_SIGNED_FINGERPRINT_SHA256}&obfs=none&upmbps=${HY2_UP}&downmbps=${HY2_DOWN}"
|
||||||
|
[[ -n "$PORT_HOPPING_START" && -n "$PORT_HOPPING_END" ]] && SHADOWROCKET_PARAMS+="&keepalive=30&mport=${PORT_HYSTERIA2},${PORT_HOPPING_START}-${PORT_HOPPING_END}"
|
||||||
local SHADOWROCKET_SUBSCRIBE+="
|
local SHADOWROCKET_SUBSCRIBE+="
|
||||||
hysteria2://${UUID[12]}@${SERVER_IP_1}:${PORT_HYSTERIA2}?peer=${TLS_SERVER}&hpkp=${SELF_SIGNED_FINGERPRINT_SHA256}&obfs=none${SHADOWROCKET_HOPPING}#${NODE_NAME[12]// /%20}%20${NODE_TAG[1]}
|
hysteria2://${UUID[12]}@${SERVER_IP_1}:${PORT_HYSTERIA2}?${SHADOWROCKET_PARAMS}#${NODE_NAME[12]// /%20}%20${NODE_TAG[1]}
|
||||||
"
|
"
|
||||||
fi
|
fi
|
||||||
[ -n "$PORT_TUIC" ] && local SHADOWROCKET_SUBSCRIBE+="
|
[ -n "$PORT_TUIC" ] && local SHADOWROCKET_SUBSCRIBE+="
|
||||||
@@ -3127,9 +3238,13 @@ anytls://${UUID[21]}@${SERVER_IP_1}:${PORT_ANYTLS}?peer=${TLS_SERVER}&udp=1&hpkp
|
|||||||
----------------------------
|
----------------------------
|
||||||
vless://${UUID[11]}@${SERVER_IP_1}:${PORT_XTLS_REALITY}?encryption=none${VISION_FLOW}&security=reality&sni=${TLS_SERVER}&fp=firefox&pbk=${REALITY_PUBLIC[11]}&type=tcp&headerType=none#${NODE_NAME[11]// /%20}%20${NODE_TAG[0]}"
|
vless://${UUID[11]}@${SERVER_IP_1}:${PORT_XTLS_REALITY}?encryption=none${VISION_FLOW}&security=reality&sni=${TLS_SERVER}&fp=firefox&pbk=${REALITY_PUBLIC[11]}&type=tcp&headerType=none#${NODE_NAME[11]// /%20}%20${NODE_TAG[0]}"
|
||||||
|
|
||||||
[ -n "$PORT_HYSTERIA2" ] && local V2RAYN_SUBSCRIBE+="
|
if [ -n "$PORT_HYSTERIA2" ]; then
|
||||||
|
local V2RAYN_PARAMS="sni=${TLS_SERVER}&alpn=h3&insecure=1&allowInsecure=1&pinSHA256=${SELF_SIGNED_FINGERPRINT_SHA256//:/}"
|
||||||
|
[[ -n "$PORT_HOPPING_START" && -n "$PORT_HOPPING_END" ]] && V2RAYN_PARAMS+="&mport=${PORT_HOPPING_START}-${PORT_HOPPING_END}"
|
||||||
|
local V2RAYN_SUBSCRIBE+="
|
||||||
----------------------------
|
----------------------------
|
||||||
hysteria2://${UUID[12]}@${SERVER_IP_1}:${PORT_HYSTERIA2}?sni=${TLS_SERVER}&alpn=h3&insecure=1&allowInsecure=1&pinSHA256=${SELF_SIGNED_FINGERPRINT_SHA256//:/}#${NODE_NAME[12]// /%20}%20${NODE_TAG[1]}"
|
hysteria2://${UUID[12]}@${SERVER_IP_1}:${PORT_HYSTERIA2}?${V2RAYN_PARAMS}#${NODE_NAME[12]// /%20}%20${NODE_TAG[1]}"
|
||||||
|
fi
|
||||||
|
|
||||||
[ -n "$PORT_TUIC" ] && local V2RAYN_SUBSCRIBE+="
|
[ -n "$PORT_TUIC" ] && local V2RAYN_SUBSCRIBE+="
|
||||||
----------------------------
|
----------------------------
|
||||||
@@ -3250,10 +3365,13 @@ anytls://${UUID[21]}@${SERVER_IP_1}:${PORT_ANYTLS}?security=tls&sni=${TLS_SERVER
|
|||||||
vless://${UUID[11]}@${SERVER_IP_1}:${PORT_XTLS_REALITY}?security=reality&sni=${TLS_SERVER}&fp=firefox&pbk=${REALITY_PUBLIC[11]}&type=tcp${VISION_FLOW}&encryption=none#${NODE_NAME[11]// /%20}%20${NODE_TAG[0]}"
|
vless://${UUID[11]}@${SERVER_IP_1}:${PORT_XTLS_REALITY}?security=reality&sni=${TLS_SERVER}&fp=firefox&pbk=${REALITY_PUBLIC[11]}&type=tcp${VISION_FLOW}&encryption=none#${NODE_NAME[11]// /%20}%20${NODE_TAG[0]}"
|
||||||
|
|
||||||
if [ -n "$PORT_HYSTERIA2" ]; then
|
if [ -n "$PORT_HYSTERIA2" ]; then
|
||||||
[[ -n "$PORT_HOPPING_START" && -n "$PORT_HOPPING_END" ]] && NEKOBOX_HOPPING="mport=${PORT_HOPPING_START}-${PORT_HOPPING_END}&"
|
local NEKOBOX_PARAMS="insecure=1&sni=${TLS_SERVER}&upmbps=${HY2_UP}&downmbps=${HY2_DOWN}"
|
||||||
|
if [[ -n "$PORT_HOPPING_START" && -n "$PORT_HOPPING_END" ]]; then
|
||||||
|
NEKOBOX_PARAMS+="&mport=${PORT_HOPPING_START}-${PORT_HOPPING_END}&hop_interval=30"
|
||||||
|
fi
|
||||||
local NEKOBOX_SUBSCRIBE+="
|
local NEKOBOX_SUBSCRIBE+="
|
||||||
----------------------------
|
----------------------------
|
||||||
hy2://${UUID[12]}@${SERVER_IP_1}:${PORT_HYSTERIA2}?${NEKOBOX_HOPPING}insecure=1&sni=${TLS_SERVER}#${NODE_NAME[12]// /%20}%20${NODE_TAG[1]}"
|
hy2://${UUID[12]}@${SERVER_IP_1}:${PORT_HYSTERIA2}?${NEKOBOX_PARAMS}#${NODE_NAME[12]// /%20}%20${NODE_TAG[1]}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[ -n "$PORT_TUIC" ] && local NEKOBOX_SUBSCRIBE+="
|
[ -n "$PORT_TUIC" ] && local NEKOBOX_SUBSCRIBE+="
|
||||||
@@ -3329,9 +3447,11 @@ anytls://${UUID[21]}@${SERVER_IP_1}:${PORT_ANYTLS}?security=tls&sni=${TLS_SERVER
|
|||||||
local NODE_REPLACE+="\"${NODE_NAME[11]} ${NODE_TAG[0]}\","
|
local NODE_REPLACE+="\"${NODE_NAME[11]} ${NODE_TAG[0]}\","
|
||||||
|
|
||||||
if [ -n "$PORT_HYSTERIA2" ]; then
|
if [ -n "$PORT_HYSTERIA2" ]; then
|
||||||
local OUTBOUND_REPLACE+=" { \"type\": \"hysteria2\", \"tag\": \"${NODE_NAME[12]} ${NODE_TAG[1]}\", \"server\": \"${SERVER_IP}\", \"server_port\": ${PORT_HYSTERIA2},"
|
local HYSTERIA2_CONFIG=" { \"type\": \"hysteria2\", \"tag\": \"${NODE_NAME[12]} ${NODE_TAG[1]}\", \"server\": \"${SERVER_IP}\", \"server_port\": ${PORT_HYSTERIA2}, \"up_mbps\": ${HY2_UP}, \"down_mbps\": ${HY2_DOWN}, \"password\": \"${UUID[12]}\", \"tls\": { \"enabled\": true, \"server_name\": \"${TLS_SERVER}\", \"certificate_public_key_sha256\": [\"$SELF_SIGNED_FINGERPRINT_BASE64\"], \"alpn\": [ \"h3\" ] } },"
|
||||||
[[ -n "${PORT_HOPPING_START}" && -n "${PORT_HOPPING_END}" ]] && local OUTBOUND_REPLACE+=" \"server_ports\": [ \"${PORT_HOPPING_START}:${PORT_HOPPING_END}\" ],"
|
if [[ -n "${PORT_HOPPING_START}" && -n "${PORT_HOPPING_END}" ]]; then
|
||||||
local OUTBOUND_REPLACE+=" \"up_mbps\": 200, \"down_mbps\": 1000, \"password\": \"${UUID[12]}\", \"tls\": { \"enabled\": true, \"server_name\": \"${TLS_SERVER}\", \"certificate_public_key_sha256\": [\"$SELF_SIGNED_FINGERPRINT_BASE64\"], \"alpn\": [ \"h3\" ] } },"
|
HYSTERIA2_CONFIG="${HYSTERIA2_CONFIG/\"server_port\": ${PORT_HYSTERIA2},/\"server_port\": ${PORT_HYSTERIA2}, \"server_ports\": [ \"${PORT_HOPPING_START}:${PORT_HOPPING_END}\" ], \"hop_interval\": \"30s\", \"hop_interval_max\": \"60s\",}"
|
||||||
|
fi
|
||||||
|
local OUTBOUND_REPLACE+="${HYSTERIA2_CONFIG}"
|
||||||
local NODE_REPLACE+="\"${NODE_NAME[12]} ${NODE_TAG[1]}\","
|
local NODE_REPLACE+="\"${NODE_NAME[12]} ${NODE_TAG[1]}\","
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user