diff --git a/install.sh b/install.sh index 371ffbb..5284a45 100644 --- a/install.sh +++ b/install.sh @@ -184,6 +184,7 @@ initVar() { singBoxVLESSRealityGRPCPort= singBoxHysteria2Port= singBoxTuicPort= + singBoxNaivePort= singBoxVMessWSPort= # nginx订阅端口 @@ -393,44 +394,45 @@ readInstallProtocolType() { singBoxVLESSRealityGRPCPort= singBoxVLESSRealityGRPCServerName= singBoxTuicPort= + singBoxNaivePort= singBoxVMessWSPort= while read -r row; do if echo "${row}" | grep -q VLESS_TCP_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'0' + currentInstallProtocolType="${currentInstallProtocolType},0," frontingType=02_VLESS_TCP_inbounds if [[ "${coreInstallType}" == "2" ]]; then singBoxVLESSVisionPort=$(jq .inbounds[0].listen_port "${row}.json") fi fi if echo "${row}" | grep -q VLESS_WS_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'1' + currentInstallProtocolType="${currentInstallProtocolType},1," fi if echo "${row}" | grep -q trojan_gRPC_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'2' + currentInstallProtocolType="${currentInstallProtocolType},2," fi if echo "${row}" | grep -q VMess_WS_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'3' + currentInstallProtocolType="${currentInstallProtocolType},3," if [[ "${coreInstallType}" == "2" ]]; then frontingType=05_VMess_WS_inbounds singBoxVMessWSPort=$(jq .inbounds[0].listen_port "${row}.json") fi fi if echo "${row}" | grep -q trojan_TCP_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'4' + currentInstallProtocolType="${currentInstallProtocolType},4," fi if echo "${row}" | grep -q VLESS_gRPC_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'5' + currentInstallProtocolType="${currentInstallProtocolType},5," fi if echo "${row}" | grep -q hysteria2_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'6' + currentInstallProtocolType="${currentInstallProtocolType},6," if [[ "${coreInstallType}" == "2" ]]; then frontingType=06_hysteria2_inbounds singBoxHysteria2Port=$(jq .inbounds[0].listen_port "${row}.json") fi fi if echo "${row}" | grep -q VLESS_vision_reality_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'7' + currentInstallProtocolType="${currentInstallProtocolType},7," if [[ "${coreInstallType}" == "2" ]]; then frontingTypeReality=07_VLESS_vision_reality_inbounds singBoxVLESSRealityVisionPort=$(jq -r .inbounds[0].listen_port "${row}.json") @@ -441,7 +443,7 @@ readInstallProtocolType() { fi fi if echo "${row}" | grep -q VLESS_vision_gRPC_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'8' + currentInstallProtocolType="${currentInstallProtocolType},8," if [[ "${coreInstallType}" == "2" ]]; then frontingTypeReality=08_VLESS_vision_gRPC_inbounds singBoxVLESSRealityGRPCPort=$(jq -r .inbounds[0].listen_port "${row}.json") @@ -452,11 +454,18 @@ readInstallProtocolType() { fi fi if echo "${row}" | grep -q tuic_inbounds; then - currentInstallProtocolType=${currentInstallProtocolType}'9' + currentInstallProtocolType="${currentInstallProtocolType},9," if [[ "${coreInstallType}" == "2" ]]; then frontingType=09_tuic_inbounds singBoxTuicPort=$(jq .inbounds[0].listen_port "${row}.json") fi + fi + if echo "${row}" | grep -q naive_inbounds; then + currentInstallProtocolType="${currentInstallProtocolType},10," + if [[ "${coreInstallType}" == "2" ]]; then + frontingType=10_naive_inbounds + singBoxNaivePort=$(jq .inbounds[0].listen_port "${row}.json") + fi fi @@ -464,11 +473,11 @@ readInstallProtocolType() { if [[ "${coreInstallType}" == "1" && -n "${singBoxConfigPath}" ]]; then if [[ -f "${singBoxConfigPath}06_hysteria2_inbounds.json" ]]; then - currentInstallProtocolType=${currentInstallProtocolType}'6' + currentInstallProtocolType="${currentInstallProtocolType},6," singBoxHysteria2Port=$(jq .inbounds[0].listen_port "${singBoxConfigPath}06_hysteria2_inbounds.json") fi if [[ -f "${singBoxConfigPath}09_tuic_inbounds.json" ]]; then - currentInstallProtocolType=${currentInstallProtocolType}'9' + currentInstallProtocolType="${currentInstallProtocolType},9," singBoxTuicPort=$(jq .inbounds[0].listen_port "${singBoxConfigPath}09_tuic_inbounds.json") fi fi @@ -708,7 +717,7 @@ readConfigHostPathUUID() { fi # reality - if echo ${currentInstallProtocolType} | grep -q 7; then + if echo ${currentInstallProtocolType} | grep -q ",7,"; then # currentUUID=$(jq -r .inbounds[0].settings.clients[0].id ${configPath}07_VLESS_vision_reality_inbounds.json) # currentClients=$(jq -r .inbounds[0].settings.clients ${configPath}07_VLESS_vision_reality_inbounds.json) xrayVLESSRealityVisionPort=$(jq -r .inbounds[0].port ${configPath}07_VLESS_vision_reality_inbounds.json) @@ -792,39 +801,39 @@ showInstallStatus() { if [[ -n ${currentInstallProtocolType} ]]; then echoContent yellow "已安装协议: \c" fi - if echo ${currentInstallProtocolType} | grep -q 0; then + if echo ${currentInstallProtocolType} | grep -q ",0,"; then echoContent yellow "VLESS+TCP[TLS_Vision] \c" fi - if echo ${currentInstallProtocolType} | grep -q 1; then + if echo ${currentInstallProtocolType} | grep -q ",1,"; then echoContent yellow "VLESS+WS[TLS] \c" fi - if echo ${currentInstallProtocolType} | grep -q 2; then + if echo ${currentInstallProtocolType} | grep -q ",2,"; then echoContent yellow "Trojan+gRPC[TLS] \c" fi - if echo ${currentInstallProtocolType} | grep -q 3; then + if echo ${currentInstallProtocolType} | grep -q ",3,"; then echoContent yellow "VMess+WS[TLS] \c" fi - if echo ${currentInstallProtocolType} | grep -q 4; then + if echo ${currentInstallProtocolType} | grep -q ",4,"; then echoContent yellow "Trojan+TCP[TLS] \c" fi - if echo ${currentInstallProtocolType} | grep -q 5; then + if echo ${currentInstallProtocolType} | grep -q ",5,"; then echoContent yellow "VLESS+gRPC[TLS] \c" fi - if echo ${currentInstallProtocolType} | grep -q 6; then + if echo ${currentInstallProtocolType} | grep -q ",6,"; then echoContent yellow "Hysteria2 \c" fi - if echo ${currentInstallProtocolType} | grep -q 7; then + if echo ${currentInstallProtocolType} | grep -q ",7,"; then echoContent yellow "VLESS+Reality+Vision \c" fi - if echo ${currentInstallProtocolType} | grep -q 8; then + if echo ${currentInstallProtocolType} | grep -q ",8,"; then echoContent yellow "VLESS+Reality+gRPC \c" fi - if echo ${currentInstallProtocolType} | grep -q 9; then + if echo ${currentInstallProtocolType} | grep -q ",9,"; then echoContent yellow "Tuic \c" fi fi @@ -1288,7 +1297,7 @@ updateRedirectNginxConf() { } EOF - if echo "${selectCustomInstallType}" | grep -q 2 && echo "${selectCustomInstallType}" | grep -q 5 || [[ -z "${selectCustomInstallType}" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",2," && echo "${selectCustomInstallType}" | grep -q ",5," || [[ -z "${selectCustomInstallType}" ]]; then cat <>${nginxConfigPath}alone.conf server { @@ -1329,7 +1338,7 @@ server { } } EOF - elif echo "${selectCustomInstallType}" | grep -q 5 || [[ -z "${selectCustomInstallType}" ]]; then + elif echo "${selectCustomInstallType}" | grep -q ",5," || [[ -z "${selectCustomInstallType}" ]]; then cat <>${nginxConfigPath}alone.conf server { ${nginxH2Conf} @@ -1352,7 +1361,7 @@ server { } EOF - elif echo "${selectCustomInstallType}" | grep -q 2 || [[ -z "${selectCustomInstallType}" ]]; then + elif echo "${selectCustomInstallType}" | grep -q ",2," || [[ -z "${selectCustomInstallType}" ]]; then cat <>${nginxConfigPath}alone.conf server { ${nginxH2Conf} @@ -2556,7 +2565,7 @@ handleSingBox() { systemctl stop sing-box.service fi fi - sleep 0.8 + sleep 1 if [[ "$1" == "start" ]]; then if [[ -n $(pgrep -f "sing-box") ]]; then @@ -2692,7 +2701,7 @@ initXrayClients() { } # 读取singbox用户数据并初始化 initSingBoxClients() { - local type=$1 + local type=",$1," local newUUID=$2 local newName=$3 if [[ -n "${newUUID}" ]]; then @@ -2707,40 +2716,47 @@ initSingBoxClients() { name=$(echo "${user}" | jq -r .name//.email | awk -F "[-]" '{print $1}') currentUser= # VLESS Vision - if echo "${type}" | grep -q "0"; then + if echo "${type}" | grep -q ",0,"; then currentUser="{\"uuid\":\"${uuid}\",\"flow\":\"xtls-rprx-vision\",\"name\":\"${name}-VLESS_TCP/TLS_Vision\"}" users=$(echo "${users}" | jq -r ". +=[${currentUser}]") fi - if echo "${type}" | grep -q "3"; then + if echo "${type}" | grep -q ",3,"; then currentUser="{\"uuid\":\"${uuid}\",\"name\":\"${name}-VMess_WS\",\"alterId\": 0}" users=$(echo "${users}" | jq -r ". +=[${currentUser}]") fi # VLESS Reality Vision - if echo "${type}" | grep -q "7"; then + if echo "${type}" | grep -q ",7,"; then currentUser="{\"uuid\":\"${uuid}\",\"flow\":\"xtls-rprx-vision\",\"name\":\"${name}-VLESS_Reality_Vision\"}" users=$(echo "${users}" | jq -r ". +=[${currentUser}]") fi # VLESS Reality gRPC - if echo "${type}" | grep -q "8"; then + if echo "${type}" | grep -q ",8,"; then currentUser="{\"uuid\":\"${uuid}\",\"name\":\"${name}-VLESS_Reality_gPRC\"}" users=$(echo "${users}" | jq -r ". +=[${currentUser}]") fi # hysteria2 - if echo "${type}" | grep -q "6"; then + if echo "${type}" | grep -q ",6,"; then currentUser="{\"password\":\"${uuid}\",\"name\":\"${name}-singbox_hysteria2\"}" users=$(echo "${users}" | jq -r ". +=[${currentUser}]") fi # tuic - if echo "${type}" | grep -q "9"; then + if echo "${type}" | grep -q ",9,"; then currentUser="{\"uuid\":\"${uuid}\",\"password\":\"${uuid}\",\"name\":\"${name}-singbox_tuic\"}" users=$(echo "${users}" | jq -r ". +=[${currentUser}]") fi + # naive + if echo "${type}" | grep -q ",10,"; then + currentUser="{\"password\":\"${uuid}\",\"username\":\"${name}-singbox_naive\"}" + + users=$(echo "${users}" | jq -r ". +=[${currentUser}]") + fi + done < <(echo "${currentClients}" | jq -c '.[]') echo "${users}" } @@ -3325,14 +3341,14 @@ singBoxTuicInstall() { echoContent red "\n ---> 此功能仅支持Xray-core内核,请全部安装或者个性化安装Hysteria2" exit 0 fi - if ! echo "${currentInstallProtocolType}" | grep -q "0" || [[ -z "${coreInstallType}" ]]; then + if ! echo "${currentInstallProtocolType}" | grep -q ",0," || [[ -z "${coreInstallType}" ]]; then echoContent red "\n ---> 由于证书环境依赖,如安装Tuic,请先安装Xray-core的VLESS_TCP_TLS_Vision" exit 0 fi totalProgress=5 installSingBox 1 - selectCustomInstallType=9 + selectCustomInstallType=",9," initSingBoxConfig custom 2 true installSingBoxService 3 reloadCore @@ -3345,14 +3361,14 @@ singBoxHysteria2Install() { echoContent red "\n ---> 此功能仅支持Xray-core内核,请全部安装或者个性化安装Hysteria2" exit 0 fi - if ! echo "${currentInstallProtocolType}" | grep -q "0" || [[ -z "${coreInstallType}" ]]; then + if ! echo "${currentInstallProtocolType}" | grep -q ",0," || [[ -z "${coreInstallType}" ]]; then echoContent red "\n ---> 由于证书环境依赖,如安装Hysteria2,请先安装Xray-core的VLESS_TCP_TLS_Vision" exit 0 fi totalProgress=5 installSingBox 1 - selectCustomInstallType=6 + selectCustomInstallType=",6," initSingBoxConfig custom 2 true installSingBoxService 3 reloadCore @@ -3610,7 +3626,7 @@ EOF local fallbacksList='{"dest":31300,"xver":0},{"alpn":"h2","dest":31302,"xver":0}' # trojan - if echo "${selectCustomInstallType}" | grep -q 4 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",4," || [[ "$1" == "all" ]]; then fallbacksList='{"dest":31296,"xver":1},{"alpn":"h2","dest":31302,"xver":0}' cat </etc/v2ray-agent/xray/conf/04_trojan_TCP_inbounds.json { @@ -3673,8 +3689,8 @@ EOF fi # trojan_grpc - if echo "${selectCustomInstallType}" | grep -q 2 || [[ "$1" == "all" ]]; then - if ! echo "${selectCustomInstallType}" | grep -q 5 && [[ -n ${selectCustomInstallType} ]]; then + if echo "${selectCustomInstallType}" | grep -q ",2," || [[ "$1" == "all" ]]; then + if ! echo "${selectCustomInstallType}" | grep -q ",5," && [[ -n ${selectCustomInstallType} ]]; then fallbacksList=${fallbacksList//31302/31304} fi cat </etc/v2ray-agent/xray/conf/04_trojan_gRPC_inbounds.json @@ -3708,7 +3724,7 @@ EOF fi # VMess_WS - if echo "${selectCustomInstallType}" | grep -q 3 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",3," || [[ "$1" == "all" ]]; then fallbacksList=${fallbacksList}',{"path":"/'${customPath}'vws","dest":31299,"xver":1}' cat </etc/v2ray-agent/xray/conf/05_VMess_WS_inbounds.json { @@ -3737,7 +3753,7 @@ EOF rm /etc/v2ray-agent/xray/conf/05_VMess_WS_inbounds.json >/dev/null 2>&1 fi - if echo "${selectCustomInstallType}" | grep -q 5 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",5," || [[ "$1" == "all" ]]; then cat </etc/v2ray-agent/xray/conf/06_VLESS_gRPC_inbounds.json { "inbounds":[ @@ -3764,7 +3780,7 @@ EOF rm /etc/v2ray-agent/xray/conf/06_VLESS_gRPC_inbounds.json >/dev/null 2>&1 fi # VLESS Vision - if echo "${selectCustomInstallType}" | grep -q 0 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",0," || [[ "$1" == "all" ]]; then cat </etc/v2ray-agent/xray/conf/02_VLESS_TCP_inbounds.json { @@ -3805,7 +3821,7 @@ EOF fi # VLESS_TCP/reality - if echo "${selectCustomInstallType}" | grep -q 7 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",7," || [[ "$1" == "all" ]]; then echoContent skyBlue "\n===================== 配置VLESS+Reality =====================\n" initRealityPort # initRealityDest @@ -3953,7 +3969,7 @@ initSingBoxConfig() { fi # VLESS Vision - if echo "${selectCustomInstallType}" | grep -q 0 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",0," || [[ "$1" == "all" ]]; then echoContent yellow "\n===================== 配置VLESS+Vision =====================\n" echoContent skyBlue "\n开始配置VLESS+Vision协议端口" echo @@ -3988,7 +4004,7 @@ EOF rm /etc/v2ray-agent/sing-box/conf/config/02_VLESS_TCP_inbounds.json >/dev/null 2>&1 fi - if echo "${selectCustomInstallType}" | grep -q 3 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",3," || [[ "$1" == "all" ]]; then echoContent yellow "\n===================== 配置VMess+ws =====================\n" echoContent skyBlue "\n开始配置VMess+ws协议端口" echo @@ -4030,7 +4046,7 @@ EOF fi # VLESS_Reality_Vision - if echo "${selectCustomInstallType}" | grep -q 7 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",7," || [[ "$1" == "all" ]]; then echoContent yellow "\n================= 配置VLESS+Reality+Vision =================\n" initRealityClientServersName initRealityKey @@ -4072,7 +4088,7 @@ EOF rm /etc/v2ray-agent/sing-box/conf/config/07_VLESS_vision_reality_inbounds.json >/dev/null 2>&1 fi - if echo "${selectCustomInstallType}" | grep -q 8 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",8," || [[ "$1" == "all" ]]; then echoContent yellow "\n================== 配置VLESS+Reality+gRPC ==================\n" initRealityClientServersName initRealityKey @@ -4117,7 +4133,7 @@ EOF rm /etc/v2ray-agent/sing-box/conf/config/08_VLESS_vision_gRPC_inbounds.json >/dev/null 2>&1 fi - if echo "${selectCustomInstallType}" | grep -q 6 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",6," || [[ "$1" == "all" ]]; then echoContent yellow "\n================== 配置 Hysteria2 ==================\n" echoContent skyBlue "\n开始配置Hysteria2协议端口" echo @@ -4151,7 +4167,7 @@ EOF rm /etc/v2ray-agent/sing-box/conf/config/06_hysteria2_inbounds.json >/dev/null 2>&1 fi - if echo "${selectCustomInstallType}" | grep -q 9 || [[ "$1" == "all" ]]; then + if echo "${selectCustomInstallType}" | grep -q ",9," || [[ "$1" == "all" ]]; then echoContent yellow "\n==================== 配置 Tuic =====================\n" echoContent skyBlue "\n开始配置Tuic协议端口" echo @@ -4184,6 +4200,35 @@ EOF elif [[ -z "$3" ]]; then rm /etc/v2ray-agent/sing-box/conf/config/09_tuic_inbounds.json >/dev/null 2>&1 fi + + if echo "${selectCustomInstallType}" | grep -q ",10," || [[ "$1" == "all" ]]; then + echoContent yellow "\n==================== 配置 Naive =====================\n" + echoContent skyBlue "\n开始配置Naive协议端口" + echo + mapfile -t result < <(initSingBoxPort "${singBoxNaivePort}") + echoContent green "\n ---> Naive端口:${result[-1]}" + cat </etc/v2ray-agent/sing-box/conf/config/10_naive_inbounds.json +{ + "inbounds": [ + { + "type": "naive", + "listen": "::", + "tag": "singbox-naive-in", + "listen_port": ${result[-1]}, + "users": $(initSingBoxClients 10), + "tls": { + "enabled": true, + "server_name":"${sslDomain}", + "certificate_path": "/etc/v2ray-agent/tls/${sslDomain}.crt", + "key_path": "/etc/v2ray-agent/tls/${sslDomain}.key" + } + } + ] +} +EOF + elif [[ -z "$3" ]]; then + rm /etc/v2ray-agent/sing-box/conf/config/10_naive_inbounds.json >/dev/null 2>&1 + fi } # 初始化Xray Reality配置 # 自定义CDN IP @@ -4520,6 +4565,15 @@ EOF EOF echoContent yellow "\n ---> 二维码 Tuic" echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=tuic%3A%2F%2F${tuicUUID}%3A${tuicPassword}%40${currentHost}%3A${tuicPort}%3Fcongestion_control%3D${tuicAlgorithm}%26alpn%3Dh3%26sni%3D${currentHost}%26udp_relay_mode%3Dquic%26allow_insecure%3D0%23${email}\n" + elif [[ "${type}" == "naive" ]]; then + echoContent yellow " ---> Naive(TLS)" + + echoContent green " naive+https://${email}:${id}@${currentHost}:${port}?padding=true#${email}\n" + cat <>"/etc/v2ray-agent/subscribe_local/default/${user}" +naive+https://${email}:${id}@${currentHost}:${port}?padding=true#${email} +EOF + echoContent yellow " ---> 二维码 Naive(TLS)" + echoContent green " https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=naive%2Bhttps%3A%2F%2F${email}%3A${id}%40${currentHost}%3A${port}%3Fpadding%3Dtrue%23${email}\n" fi } @@ -4536,7 +4590,7 @@ showAccounts() { echoContent skyBlue "\n进度 $1/${totalProgress} : 账号" # VLESS TCP - if echo ${currentInstallProtocolType} | grep -q 0; then + if echo ${currentInstallProtocolType} | grep -q ",0,"; then echoContent skyBlue "============================= VLESS TCP TLS_Vision [推荐] ==============================\n" jq .inbounds[0].settings.clients//.inbounds[0].users ${configPath}02_VLESS_TCP_inbounds.json | jq -c '.[]' | while read -r user; do @@ -4550,7 +4604,7 @@ showAccounts() { fi # VLESS WS - if echo ${currentInstallProtocolType} | grep -q 1; then + if echo ${currentInstallProtocolType} | grep -q ",1,"; then echoContent skyBlue "\n================================ VLESS WS TLS [仅CDN推荐] ================================\n" jq .inbounds[0].settings.clients ${configPath}03_VLESS_WS_inbounds.json | jq -c '.[]' | while read -r user; do @@ -4572,7 +4626,7 @@ showAccounts() { fi # VLESS grpc - if echo ${currentInstallProtocolType} | grep -q 5; then + if echo ${currentInstallProtocolType} | grep -q ",5,"; then echoContent skyBlue "\n=============================== VLESS gRPC TLS [仅CDN推荐] ===============================\n" jq .inbounds[0].settings.clients ${configPath}06_VLESS_gRPC_inbounds.json | jq -c '.[]' | while read -r user; do @@ -4593,7 +4647,7 @@ showAccounts() { fi # VMess WS - if echo ${currentInstallProtocolType} | grep -q 3; then + if echo ${currentInstallProtocolType} | grep -q ",3,"; then echoContent skyBlue "\n================================ VMess WS TLS [仅CDN推荐] ================================\n" local path="${currentPath}vws" if [[ ${coreInstallType} == "1" ]]; then @@ -4618,7 +4672,7 @@ showAccounts() { fi # trojan tcp - if echo ${currentInstallProtocolType} | grep -q 4; then + if echo ${currentInstallProtocolType} | grep -q ",4,"; then echoContent skyBlue "\n================================== Trojan TLS [不推荐] ==================================\n" jq .inbounds[0].settings.clients ${configPath}04_trojan_TCP_inbounds.json | jq -c '.[]' | while read -r user; do local email= @@ -4630,7 +4684,7 @@ showAccounts() { fi # trojan grpc - if echo ${currentInstallProtocolType} | grep -q 2; then + if echo ${currentInstallProtocolType} | grep -q ",2,"; then echoContent skyBlue "\n================================ Trojan gRPC TLS [仅CDN推荐] ================================\n" jq .inbounds[0].settings.clients ${configPath}04_trojan_gRPC_inbounds.json | jq -c '.[]' | while read -r user; do local email= @@ -4649,7 +4703,7 @@ showAccounts() { done fi # hysteria2 - if echo ${currentInstallProtocolType} | grep -q 6 || [[ -n "${hysteriaPort}" ]]; then + if echo ${currentInstallProtocolType} | grep -q ",6," || [[ -n "${hysteriaPort}" ]]; then echoContent skyBlue "\n================================ Hysteria2 TLS [推荐] ================================\n" local path="${configPath}" if [[ "${coreInstallType}" == "1" ]]; then @@ -4664,7 +4718,7 @@ showAccounts() { fi # VLESS reality vision - if echo ${currentInstallProtocolType} | grep -q 7; then + if echo ${currentInstallProtocolType} | grep -q ",7,"; then echoContent skyBlue "============================= VLESS reality_vision [推荐] ==============================\n" jq .inbounds[0].settings.clients//.inbounds[0].users ${configPath}07_VLESS_vision_reality_inbounds.json | jq -c '.[]' | while read -r user; do local email= @@ -4676,7 +4730,7 @@ showAccounts() { done fi # VLESS reality gRPC - if echo ${currentInstallProtocolType} | grep -q 8; then + if echo ${currentInstallProtocolType} | grep -q ",8,"; then echoContent skyBlue "============================== VLESS reality_gRPC [推荐] ===============================\n" jq .inbounds[0].settings.clients//.inbounds[0].users ${configPath}08_VLESS_vision_gRPC_inbounds.json | jq -c '.[]' | while read -r user; do local email= @@ -4688,7 +4742,7 @@ showAccounts() { done fi # tuic - if echo ${currentInstallProtocolType} | grep -q 9 || [[ -n "${tuicPort}" ]]; then + if echo ${currentInstallProtocolType} | grep -q ",9," || [[ -n "${tuicPort}" ]]; then echoContent skyBlue "\n================================ Tuic TLS [推荐] ================================\n" local path="${configPath}" if [[ "${coreInstallType}" == "1" ]]; then @@ -4701,6 +4755,17 @@ showAccounts() { done fi + # naive + if echo ${currentInstallProtocolType} | grep -q ",10," || [[ -n "${tuicPort}" ]]; then + echoContent skyBlue "\n================================ naive TLS [推荐,不支持ClashMeta] ================================\n" + + jq -r -c '.inbounds[]|.users[]' "${configPath}10_naive_inbounds.json" | while read -r user; do + echoContent skyBlue "\n ---> 账号:$(echo "${user}" | jq -r .username)" + echo + defaultBase64Code naive "${singBoxNaivePort}" "$(echo "${user}" | jq -r .username)" "$(echo "${user}" | jq -r .password)" + done + + fi } # 移除nginx302配置 removeNginx302() { @@ -4775,7 +4840,7 @@ updateNginxBlog() { echoContent skyBlue "\n进度 $1/${totalProgress} : 更换伪装站点" - if ! echo "${currentInstallProtocolType}" | grep -q "0" || [[ -z "${coreInstallType}" ]]; then + if ! echo "${currentInstallProtocolType}" | grep -q ",0," || [[ -z "${coreInstallType}" ]]; then echoContent red "\n ---> 由于环境依赖,请先安装Xray-core的VLESS_TCP_TLS_Vision" exit 0 fi @@ -5073,7 +5138,7 @@ customUUID() { if [[ "${coreInstallType}" == "1" ]]; then checkUUID=$(jq -r --arg currentUUID "$currentCustomUUID" ".inbounds[0].settings.clients[] | select(.uuid | index(\$currentUUID) != null) | .name" ${configPath}${frontingType}.json) elif [[ "${coreInstallType}" == "2" ]]; then - checkUUID=$(jq -r --arg currentUUID "$currentCustomUUID" ".inbounds[0].users[] | select(.uuid | index(\$currentUUID) != null) | .name" ${configPath}${frontingType}.json) + checkUUID=$(jq -r --arg currentUUID "$currentCustomUUID" ".inbounds[0].users[] | select(.uuid | index(\$currentUUID) != null) | .name//.username" ${configPath}${frontingType}.json) fi if [[ -n "${checkUUID}" ]]; then @@ -5230,7 +5295,7 @@ addUser() { fi # hysteria2 - if echo ${currentInstallProtocolType} | grep -q 6; then + if echo ${currentInstallProtocolType} | grep -q ",6,"; then local clients= if [[ "${coreInstallType}" == "1" ]]; then @@ -5244,7 +5309,7 @@ addUser() { fi # tuic - if echo ${currentInstallProtocolType} | grep -q 9; then + if echo ${currentInstallProtocolType} | grep -q ",9,"; then local clients= if [[ "${coreInstallType}" == "1" ]]; then clients=$(initXrayClients 9 "${uuid}" "${email}") @@ -5288,58 +5353,58 @@ removeUser() { if [[ -n "${delUserIndex}" ]]; then - if echo ${currentInstallProtocolType} | grep -q 0; then + if echo ${currentInstallProtocolType} | grep -q ",0,"; then local vlessVision vlessVision=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}']//.inbounds[0].users['${delUserIndex}'])' ${configPath}02_VLESS_TCP_inbounds.json) echo "${vlessVision}" | jq . >${configPath}02_VLESS_TCP_inbounds.json fi - if echo ${currentInstallProtocolType} | grep -q 1; then + if echo ${currentInstallProtocolType} | grep -q ",1,"; then local vlessWSResult vlessWSResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}03_VLESS_WS_inbounds.json) echo "${vlessWSResult}" | jq . >${configPath}03_VLESS_WS_inbounds.json fi - if echo ${currentInstallProtocolType} | grep -q 2; then + if echo ${currentInstallProtocolType} | grep -q ",2,"; then local trojangRPCUsers trojangRPCUsers=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}04_trojan_gRPC_inbounds.json) echo "${trojangRPCUsers}" | jq . >${configPath}04_trojan_gRPC_inbounds.json fi - if echo ${currentInstallProtocolType} | grep -q 3; then + if echo ${currentInstallProtocolType} | grep -q ",3,"; then local vmessWSResult vmessWSResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}05_VMess_WS_inbounds.json) echo "${vmessWSResult}" | jq . >${configPath}05_VMess_WS_inbounds.json fi - if echo ${currentInstallProtocolType} | grep -q 5; then + if echo ${currentInstallProtocolType} | grep -q ",5,"; then local vlessGRPCResult vlessGRPCResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}06_VLESS_gRPC_inbounds.json) echo "${vlessGRPCResult}" | jq . >${configPath}06_VLESS_gRPC_inbounds.json fi - if echo ${currentInstallProtocolType} | grep -q 4; then + if echo ${currentInstallProtocolType} | grep -q ",4,"; then local trojanTCPResult trojanTCPResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}'])' ${configPath}04_trojan_TCP_inbounds.json) echo "${trojanTCPResult}" | jq . >${configPath}04_trojan_TCP_inbounds.json fi - if echo ${currentInstallProtocolType} | grep -q 7; then + if echo ${currentInstallProtocolType} | grep -q ",7,"; then local vlessRealityResult vlessRealityResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}']//.inbounds[0].users['${delUserIndex}'])' ${configPath}07_VLESS_vision_reality_inbounds.json) echo "${vlessRealityResult}" | jq . >${configPath}07_VLESS_vision_reality_inbounds.json fi - if echo ${currentInstallProtocolType} | grep -q 8; then + if echo ${currentInstallProtocolType} | grep -q ",8,"; then local vlessRealityGRPCResult vlessRealityGRPCResult=$(jq -r 'del(.inbounds[0].settings.clients['${delUserIndex}']//.inbounds[0].users['${delUserIndex}'])' ${configPath}08_VLESS_vision_gRPC_inbounds.json) echo "${vlessRealityGRPCResult}" | jq . >${configPath}08_VLESS_vision_gRPC_inbounds.json fi - if echo ${currentInstallProtocolType} | grep -q 6; then + if echo ${currentInstallProtocolType} | grep -q ",6,"; then local hysteriaResult hysteriaResult=$(jq -r 'del(.inbounds[0].users['${delUserIndex}'])' "${singBoxConfigPath}06_hysteria2_inbounds.json") echo "${hysteriaResult}" | jq . >"${singBoxConfigPath}06_hysteria2_inbounds.json" fi - if echo ${currentInstallProtocolType} | grep -q 9; then + if echo ${currentInstallProtocolType} | grep -q ",9,"; then local tuicResult tuicResult=$(jq -r 'del(.inbounds[0].users['${delUserIndex}'])' "${singBoxConfigPath}09_tuic_inbounds.json") echo "${tuicResult}" | jq . >"${singBoxConfigPath}09_tuic_inbounds.json" @@ -6871,16 +6936,27 @@ customSingBoxInstall() { echoContent yellow "7.VLESS+Reality+Vision" echoContent yellow "8.VLESS+Reality+gRPC" echoContent yellow "9.Tuic" + echoContent yellow "10.Naive" - read -r -p "请选择[多选],[例如:123]:" selectCustomInstallType + read -r -p "请选择[多选],[例如:1,2,3]:" selectCustomInstallType echoContent skyBlue "--------------------------------------------------------------" + if echo "${selectCustomInstallType}" | grep -q ","; then + echoContent red " ---> 请使用英文逗号分隔" + exit 0 + fi + if [[ "${selectCustomInstallType: -1}" != "," ]]; then + selectCustomInstallType="${selectCustomInstallType}," + fi + if [[ "${selectCustomInstallType:0:1}" != "," ]]; then + selectCustomInstallType=",${selectCustomInstallType}," + fi - if [[ "${selectCustomInstallType}" =~ ^[0-9]+$ ]]; then + if [[ "${selectCustomInstallType//,/}" =~ ^[0-9]+$ ]]; then # checkBTPanel totalProgress=9 installTools 1 # 申请tls - if echo "${selectCustomInstallType}" | grep -q -E "0|3|6|9"; then + if echo "${selectCustomInstallType}" | grep -q -E ",0,|,3,|,6,|,9,|,10,"; then initTLSNginxConfig 2 installTLS 3 handleNginx stop @@ -6915,15 +6991,24 @@ customXrayInstall() { echoContent yellow "5.VLESS+TLS+gRPC[仅CDN推荐]" echoContent yellow "7.VLESS+Reality+uTLS+Vision[推荐]" # echoContent yellow "8.VLESS+Reality+gRPC" - read -r -p "请选择[多选],[例如:123]:" selectCustomInstallType + read -r -p "请选择[多选],[例如:1,2,3]:" selectCustomInstallType echoContent skyBlue "--------------------------------------------------------------" - if [[ -z ${selectCustomInstallType} ]]; then - echoContent red " ---> 不可为空" - customXrayInstall - elif [[ "${selectCustomInstallType}" =~ ^[0-7]+$ ]]; then + if echo "${selectCustomInstallType}" | grep -q ","; then + echoContent red " ---> 请使用英文逗号分隔" + exit 0 + fi + if [[ "${selectCustomInstallType: -1}" != "," ]]; then + selectCustomInstallType="${selectCustomInstallType}," + fi - if ! echo "${selectCustomInstallType}" | grep -q "0"; then - selectCustomInstallType="0${selectCustomInstallType}" + if [[ "${selectCustomInstallType:0:1}" != "," ]]; then + selectCustomInstallType=",${selectCustomInstallType}," + fi + + if [[ "${selectCustomInstallType//,/}" =~ ^[0-7]+$ ]]; then + + if ! echo "${selectCustomInstallType}" | grep -q ",0,"; then + selectCustomInstallType=",0,${selectCustomInstallType}," fi unInstallSubscribe checkBTPanel @@ -6943,7 +7028,7 @@ customXrayInstall() { handleNginx stop # 随机path - if echo "${selectCustomInstallType}" | grep -q 1 || echo "${selectCustomInstallType}" | grep -q 2 || echo "${selectCustomInstallType}" | grep -q 3 || echo "${selectCustomInstallType}" | grep -q 5; then + if echo "${selectCustomInstallType}" | grep -q ",1," || echo "${selectCustomInstallType}" | grep -q ",2," || echo "${selectCustomInstallType}" | grep -q ",3," || echo "${selectCustomInstallType}" | grep -q ",5,"; then randomPathFunction 4 customCDNIP 5 fi @@ -7103,7 +7188,7 @@ singBoxInstall() { # Hysteria安装 hysteriaCoreInstall() { - if ! echo "${currentInstallProtocolType}" | grep -q "0" || [[ -z "${coreInstallType}" ]]; then + if ! echo "${currentInstallProtocolType}" | grep -q ",0," || [[ -z "${coreInstallType}" ]]; then echoContent red "\n ---> 由于环境依赖,如安装hysteria,请先安装Xray-core的VLESS_TCP_TLS_Vision" exit 0 fi @@ -7241,9 +7326,9 @@ installSubscribe() { local httpSubscribeStatus= if [[ "${selectInstallType}" == "2" || "${coreInstallType}" == "2" ]]; then - if [[ -n "${selectCustomInstallType}" ]] && ! echo "${selectCustomInstallType}" | grep -q -E "0|1|2|3|4|5|6|9"; then + if [[ -n "${selectCustomInstallType}" ]] && ! echo "${selectCustomInstallType}" | grep -q -E ",0,|,1,|,2,|,3,|,4,|,5,|,6,|,9,|,10,"; then httpSubscribeStatus=true - elif [[ -n "${currentInstallProtocolType}" ]] && ! echo "${currentInstallProtocolType}" | grep -q -E "0|1|2|3|4|5|6|9"; then + elif [[ -n "${currentInstallProtocolType}" ]] && ! echo "${currentInstallProtocolType}" | grep -q -E ",0,|,1,|,2,|,3,|,4,|,5,|,6,|,9,|,10,"; then httpSubscribeStatus=true fi fi @@ -7799,7 +7884,7 @@ subscribe() { showAccounts >/dev/null if [[ -n $(ls /etc/v2ray-agent/subscribe_local/default/) ]]; then - if [[ -n $(cat "/etc/v2ray-agent/subscribe_remote/remoteSubscribeUrl") ]]; then + if [[ -f "/etc/v2ray-agent/subscribe_remote/remoteSubscribeUrl" && -n $(cat "/etc/v2ray-agent/subscribe_remote/remoteSubscribeUrl") ]]; then read -r -p "读取到其他订阅,是否更新?[y/n]" updateOtherSubscribeStatus fi @@ -7988,7 +8073,7 @@ initRealityDest() { realityDestDomain=${domain}:${port} else local realityDestDomainList= - realityDestDomainList="gateway.icloud.com,itunes.apple.com,swdist.apple.com,swcdn.apple.com,updates.cdn-apple.com,mensura.cdn-apple.com,osxapps.itunes.apple.com,aod.itunes.apple.com,download-installer.cdn.mozilla.net,addons.mozilla.org,s0.awsstatic.com,d1.awsstatic.com,images-na.ssl-images-amazon.com,m.media-amazon.com,player.live-video.net,one-piece.com,lol.secure.dyn.riotcdn.net,www.lovelive-anime.jp,www.swift.com,academy.nvidia.com,www.cisco.com,www.asus.com,www.samsung.com,www.amd.com,www.googletagmanager.com,cdn-dynmedia-1.microsoft.com,update.microsoft,software.download.prss.microsoft.com,dl.google.com,www.google-analytics.com" + realityDestDomainList="gateway.icloud.com,itunes.apple.com,swdist.apple.com,swcdn.apple.com,updates.cdn-apple.com,mensura.cdn-apple.com,osxapps.itunes.apple.com,aod.itunes.apple.com,download-installer.cdn.mozilla.net,addons.mozilla.org,s0.awsstatic.com,d1.awsstatic.com,images-na.ssl-images-amazon.com,m.media-amazon.com,player.live-video.net,one-piece.com,lol.secure.dyn.riotcdn.net,www.lovelive-anime.jp,www.swift.com,academy.nvidia.com,www.cisco.com,www.samsung.com,www.amd.com,www.googletagmanager.com,cdn-dynmedia-1.microsoft.com,update.microsoft,software.download.prss.microsoft.com,dl.google.com,www.google-analytics.com" echoContent skyBlue "\n===== 生成配置回落的域名 例如:[addons.mozilla.org:443] ======\n" echoContent green "回落域名列表:https://www.v2ray-agent.com/archives/1680104902581#heading-8\n" @@ -8130,20 +8215,20 @@ xrayCoreRealityInstall() { # reality管理 manageReality() { readInstallProtocolType - if ! echo "${currentInstallProtocolType}" | grep -q -E "7|8" || [[ -z "${coreInstallType}" ]]; then + if ! echo "${currentInstallProtocolType}" | grep -q -E "7,|8," || [[ -z "${coreInstallType}" ]]; then echoContent red "\n ---> 请先安装Reality协议,参考教程 https://www.v2ray-agent.com/archives/1680104902581#heading-11" exit 0 fi if [[ "${coreInstallType}" == "1" ]]; then - selectCustomInstallType=7 + selectCustomInstallType=",7," initXrayConfig custom 1 true elif [[ "${coreInstallType}" == "2" ]]; then - if echo "${currentInstallProtocolType}" | grep -q "7"; then - selectCustomInstallType=7 + if echo "${currentInstallProtocolType}" | grep -q ",7,"; then + selectCustomInstallType=",7," fi - if echo "${currentInstallProtocolType}" | grep -q "8"; then - selectCustomInstallType=8 + if echo "${currentInstallProtocolType}" | grep -q ",8,"; then + selectCustomInstallType="${selectCustomInstallType},8," fi initSingBoxConfig custom 1 true fi @@ -8343,7 +8428,7 @@ menu() { cd "$HOME" || exit echoContent red "\n==============================================================" echoContent green "作者:mack-a" - echoContent green "当前版本:v3.1.22" + echoContent green "当前版本:v3.1.23" echoContent green "Github:https://github.com/mack-a/v2ray-agent" echoContent green "描述:八合一共存脚本\c" showInstallStatus