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:
fscarmen
2026-04-09 15:00:51 +00:00
parent 1d02e20855
commit cd2632ba9d
2 changed files with 149 additions and 27 deletions
+2
View File
@@ -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
View File
@@ -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