mirror of
https://github.com/fscarmen/sing-box.git
synced 2026-08-10 17:55:16 +08:00
v1.2.2 Complete 8 non-interactive installation modes.
This commit is contained in:
+93
-61
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# 当前脚本版本号
|
||||
VERSION='v1.2.1 (2024.04.16)'
|
||||
VERSION='v1.2.2 (2024.05.03)'
|
||||
|
||||
# 各变量默认值
|
||||
GH_PROXY=''
|
||||
@@ -14,7 +14,7 @@ TLS_SERVER_DEFAULT=addons.mozilla.org
|
||||
PROTOCOL_LIST=("XTLS + reality" "hysteria2" "tuic" "ShadowTLS" "shadowsocks" "trojan" "vmess + ws" "vless + ws + tls" "H2 + reality" "gRPC + reality")
|
||||
NODE_TAG=("xtls-reality" "hysteria2" "tuic" "ShadowTLS" "shadowsocks" "trojan" "vmess-ws" "vless-ws-tls" "h2-reality" "grpc-reality")
|
||||
CONSECUTIVE_PORTS=${#PROTOCOL_LIST[@]}
|
||||
CDN_DOMAIN=("cn.azhz.eu.org" "visa.com" "skk.moe" "time.cloudflare.com" "csgo.com")
|
||||
CDN_DOMAIN=("cn.azhz.eu.org" "visa.com" "skk.moe" "dashboard.cloudflare.com" "csgo.com")
|
||||
SUBSCRIBE_TEMPLATE="https://raw.githubusercontent.com/fscarmen/client_template/main"
|
||||
|
||||
trap "rm -rf $TEMP_DIR >/dev/null 2>&1 ; echo -e '\n' ;exit 1" INT QUIT TERM EXIT
|
||||
@@ -23,8 +23,8 @@ mkdir -p $TEMP_DIR
|
||||
|
||||
E[0]="Language:\n 1. English (default) \n 2. 简体中文"
|
||||
C[0]="${E[0]}"
|
||||
E[1]="1. Fix the bug of dynamically adding and removing protocols; 2. CentOS 7 add EPEL to install nginx"
|
||||
C[1]="1. 修复动态增加和删除协议的 bug; 2. CentOS 7 增加 EPEL 软件仓库,以便安装 Nginx"
|
||||
E[1]="Complete 8 non-interactive installation modes, direct output results. Suitable for mass installation scenarios. You can put the commands in the favorites of the ssh software. Please refer to the README.md description for details."
|
||||
C[1]="完善8种无交互安装模式,直接输出结果,适合大量装机的情景,可以把命令放在 ssh 软件的收藏夹,详细请参考README.md 说明"
|
||||
E[2]="Downloading Sing-box. Please wait a seconds ..."
|
||||
C[2]="下载 Sing-box 中,请稍等 ..."
|
||||
E[3]="Input errors up to 5 times.The script is aborted."
|
||||
@@ -312,7 +312,7 @@ input_nginx_port() {
|
||||
input_argo_auth() {
|
||||
local IS_CHANGE_ARGO=$1
|
||||
[ -n "$IS_CHANGE_ARGO" ] && local EMPTY_ERROR_TIME=5
|
||||
local DOMAIN_ERROR_TIME=5
|
||||
local DOMAIN_ERROR_TIME=6
|
||||
|
||||
# 处理可能输入的错误,去掉开头和结尾的空格,去掉最后的 :
|
||||
if [ "$IS_CHANGE_ARGO" = 'is_change_argo' ]; then
|
||||
@@ -322,31 +322,37 @@ input_argo_auth() {
|
||||
reading "\n $(text 88) " ARGO_DOMAIN
|
||||
[ -n "$IS_CHANGE_ARGO" ] && ARGO_DOMAIN=$(sed 's/[ ]*//g; s/:[ ]*//' <<< "$ARGO_DOMAIN")
|
||||
done
|
||||
else
|
||||
elif [ "$NONINTERACTIVE_INSTALL" != 'noninteractive_install' ]; then
|
||||
[ -z "$ARGO_DOMAIN" ] && reading "\n $(text 87) " ARGO_DOMAIN
|
||||
ARGO_DOMAIN=$(sed 's/[ ]*//g; s/:[ ]*//' <<< "$ARGO_DOMAIN")
|
||||
fi
|
||||
|
||||
if [[ -z "$ARGO_DOMAIN" && ( "$ARGO_DOMAIN" =~ trycloudflare\.com$ || "$IS_CHANGE_ARGO" = 'is_add_protocols' || "$IS_CHANGE_ARGO" = 'is_install' ) ]]; then
|
||||
if [[ -z "$ARGO_DOMAIN" && ( "$ARGO_DOMAIN" =~ trycloudflare\.com$ || "$IS_CHANGE_ARGO" = 'is_add_protocols' || "$IS_CHANGE_ARGO" = 'is_install' || "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ) ]]; then
|
||||
ARGO_RUNS="$WORK_DIR/cloudflared tunnel --edge-ip-version auto --no-autoupdate --url http://localhost:$PORT_NGINX"
|
||||
elif [[ -n "${ARGO_DOMAIN}" && -z "${ARGO_AUTH}" ]]; then
|
||||
until [[ "$ARGO_AUTH" =~ TunnelSecret || "$ARGO_AUTH" =~ ^[A-Z0-9a-z=]{120,250}$ || "$ARGO_AUTH" =~ .*cloudflared.*service[[:space:]]+install[[:space:]]+[A-Z0-9a-z=]{1,100} ]]; do
|
||||
elif [ -n "${ARGO_DOMAIN}" ]; then
|
||||
if [ -z "${ARGO_AUTH}" ]; then
|
||||
until [[ "$ARGO_AUTH" =~ TunnelSecret || "$ARGO_AUTH" =~ ^[A-Z0-9a-z=]{120,250}$ || "$ARGO_AUTH" =~ .*cloudflared.*service[[:space:]]+install[[:space:]]+[A-Z0-9a-z=]{1,100} ]]; do
|
||||
[ "$DOMAIN_ERROR_TIME" != 6 ] && warning "\n $(text 86) \n"
|
||||
(( DOMAIN_ERROR_TIME-- )) || true
|
||||
[ "$DOMAIN_ERROR_TIME" != 0 ] && reading "\n $(text 85) " ARGO_AUTH || error "\n $(text 3) \n"
|
||||
if [[ "$ARGO_AUTH" =~ TunnelSecret ]]; then
|
||||
ARGO_JSON=${ARGO_AUTH//[ ]/}
|
||||
[ "$IS_CHANGE_ARGO" = 'is_install' ] && export_argo_json_file $TEMP_DIR || export_argo_json_file $WORK_DIR
|
||||
ARGO_RUNS="$WORK_DIR/cloudflared tunnel --edge-ip-version auto --config $WORK_DIR/tunnel.yml run"
|
||||
elif [[ "$ARGO_AUTH" =~ ^[A-Z0-9a-z=]{120,250}$ ]]; then
|
||||
ARGO_TOKEN=$ARGO_AUTH
|
||||
ARGO_RUNS="$WORK_DIR/cloudflared tunnel --edge-ip-version auto run --token ${ARGO_TOKEN}"
|
||||
elif [[ "$ARGO_AUTH" =~ .*cloudflared.*service[[:space:]]+install[[:space:]]+[A-Z0-9a-z=]{1,100} ]]; then
|
||||
ARGO_TOKEN=$(awk -F ' ' '{print $NF}' <<< "$ARGO_AUTH")
|
||||
ARGO_RUNS="$WORK_DIR/cloudflared tunnel --edge-ip-version auto run --token ${ARGO_TOKEN}"
|
||||
else
|
||||
warning "\n $(text 86) \n"
|
||||
fi
|
||||
done
|
||||
[ "$DOMAIN_ERROR_TIME" != 0 ] && reading "\n $(text 85) " ARGO_AUTH || error "\n $(text 3) \n"
|
||||
done
|
||||
fi
|
||||
|
||||
# 根据 ARGO_AUTH 的内容,自行判断是 Json 还是 Token
|
||||
if [[ "$ARGO_AUTH" =~ TunnelSecret ]]; then
|
||||
ARGO_TYPE=is_json_argo
|
||||
ARGO_JSON=${ARGO_AUTH//[ ]/}
|
||||
[ "$IS_CHANGE_ARGO" = 'is_install' ] && export_argo_json_file $TEMP_DIR || export_argo_json_file $WORK_DIR
|
||||
ARGO_RUNS="$WORK_DIR/cloudflared tunnel --edge-ip-version auto --config $WORK_DIR/tunnel.yml run"
|
||||
elif [[ "$ARGO_AUTH" =~ ^[A-Z0-9a-z=]{120,250}$ ]]; then
|
||||
ARGO_TYPE=is_token_argo
|
||||
ARGO_TOKEN=$ARGO_AUTH
|
||||
ARGO_RUNS="$WORK_DIR/cloudflared tunnel --edge-ip-version auto run --token ${ARGO_TOKEN}"
|
||||
elif [[ "$ARGO_AUTH" =~ .*cloudflared.*service[[:space:]]+install[[:space:]]+[A-Z0-9a-z=]{1,100} ]]; then
|
||||
ARGO_TYPE=is_token_argo
|
||||
ARGO_TOKEN=$(awk -F ' ' '{print $NF}' <<< "$ARGO_AUTH")
|
||||
ARGO_RUNS="$WORK_DIR/cloudflared tunnel --edge-ip-version auto run --token ${ARGO_TOKEN}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -397,10 +403,10 @@ change_argo() {
|
||||
exit 0
|
||||
esac
|
||||
|
||||
cmd_systemctl enable argo
|
||||
fetch_nodes_value
|
||||
export_nginx_conf_file
|
||||
export_list
|
||||
cmd_systemctl enable argo
|
||||
fetch_nodes_value
|
||||
export_nginx_conf_file
|
||||
export_list
|
||||
}
|
||||
|
||||
check_root() {
|
||||
@@ -432,7 +438,7 @@ check_install() {
|
||||
{
|
||||
local VERSION_LATEST=$(wget --no-check-certificate -qO- "https://api.github.com/repos/SagerNet/sing-box/releases" | awk -F '["v-]' '/tag_name/{print $5}' | sort -r | sed -n '1p')
|
||||
local ONLINE=$(wget --no-check-certificate -qO- "https://api.github.com/repos/SagerNet/sing-box/releases" | awk -F '["v]' -v var="tag_name.*$VERSION_LATEST" '$0 ~ var {print $5; exit}')
|
||||
ONLINE=${ONLINE:-'1.9.0-rc.2'}
|
||||
ONLINE=${ONLINE:-'1.9.0-rc.14'}
|
||||
wget --no-check-certificate --continue ${GH_PROXY}https://github.com/SagerNet/sing-box/releases/download/v$ONLINE/sing-box-$ONLINE-linux-$SING_BOX_ARCH.tar.gz -qO- | tar xz -C $TEMP_DIR sing-box-$ONLINE-linux-$SING_BOX_ARCH/sing-box >/dev/null 2>&1
|
||||
[ -s $TEMP_DIR/sing-box-$ONLINE-linux-$SING_BOX_ARCH/sing-box ] && mv $TEMP_DIR/sing-box-$ONLINE-linux-$SING_BOX_ARCH/sing-box $TEMP_DIR
|
||||
wget --no-check-certificate --continue -qO $TEMP_DIR/jq ${GH_PROXY}https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-$JQ_ARCH >/dev/null 2>&1 && chmod +x $TEMP_DIR/jq >/dev/null 2>&1
|
||||
@@ -440,7 +446,9 @@ check_install() {
|
||||
}&
|
||||
fi
|
||||
|
||||
STATUS[1]=$(text 26) && IS_ARGO=no_argo && [ -s /etc/systemd/system/argo.service ] && IS_ARGO=is_argo && STATUS[1]=$(text 27) && [ "$(systemctl is-active argo)" = 'active' ] && STATUS[1]=$(text 28)
|
||||
if [ "$NONINTERACTIVE_INSTALL" != 'noninteractive_install' ]; then
|
||||
STATUS[1]=$(text 26) && IS_ARGO=no_argo && [ -s /etc/systemd/system/argo.service ] && IS_ARGO=is_argo && STATUS[1]=$(text 27) && [ "$(systemctl is-active argo)" = 'active' ] && STATUS[1]=$(text 28)
|
||||
fi
|
||||
if [ -s /etc/systemd/system/argo.service ]; then
|
||||
local ARGO_CONTENT=$(cat /etc/systemd/system/argo.service)
|
||||
if grep -q '\--token' <<< "$ARGO_CONTENT"; then
|
||||
@@ -451,7 +459,7 @@ check_install() {
|
||||
ARGO_TYPE=is_quicktunnel_argo
|
||||
fi
|
||||
fi
|
||||
[[ "${STATUS[1]}" = "$(text 26)" ]] && [ ! -s $WORK_DIR/cloudflared ] && { wget --no-check-certificate -qO $TEMP_DIR/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-$ARGO_ARCH >/dev/null 2>&1 && chmod +x $TEMP_DIR/cloudflared >/dev/null 2>&1; }&
|
||||
[[ "${STATUS[1]}" = "$(text 26)" || "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]] && [ ! -s $WORK_DIR/cloudflared ] && { wget --no-check-certificate -qO $TEMP_DIR/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-$ARGO_ARCH >/dev/null 2>&1 && chmod +x $TEMP_DIR/cloudflared >/dev/null 2>&1; }&
|
||||
}
|
||||
|
||||
# 检测 sing-box 的状态
|
||||
@@ -599,27 +607,22 @@ input_start_port() {
|
||||
# 定义 Sing-box 变量
|
||||
sing-box_variables() {
|
||||
if grep -qi 'cloudflare' <<< "$ASNORG4$ASNORG6"; then
|
||||
local a=6
|
||||
until [ -n "$SERVER_IP" ]; do
|
||||
((a--)) || true
|
||||
[ "$a" = 0 ] && error "\n $(text 3) \n"
|
||||
reading "\n $(text 46) " SERVER_IP
|
||||
done
|
||||
if [[ "$SERVER_IP" =~ : ]]; then
|
||||
WARP_ENDPOINT=2606:4700:d0::a29f:c101
|
||||
DOMAIN_STRATEG=prefer_ipv6
|
||||
if grep -qi 'cloudflare' <<< "$ASNORG6" && [ -n "$WAN4" ] && ! grep -qi 'cloudflare' <<< "$ASNORG4"; then
|
||||
SERVER_IP_DEFAULT=$WAN4
|
||||
elif grep -qi 'cloudflare' <<< "$ASNORG4" && [ -n "$WAN6" ] && ! grep -qi 'cloudflare' <<< "$ASNORG6"; then
|
||||
SERVER_IP_DEFAULT=$WAN6
|
||||
else
|
||||
WARP_ENDPOINT=162.159.193.10
|
||||
DOMAIN_STRATEG=prefer_ipv4
|
||||
local a=6
|
||||
until [ -n "$SERVER_IP" ]; do
|
||||
((a--)) || true
|
||||
[ "$a" = 0 ] && error "\n $(text 3) \n"
|
||||
reading "\n $(text 46) " SERVER_IP
|
||||
done
|
||||
fi
|
||||
elif [ -n "$WAN4" ]; then
|
||||
SERVER_IP_DEFAULT=$WAN4
|
||||
WARP_ENDPOINT=162.159.193.10
|
||||
DOMAIN_STRATEG=prefer_ipv4
|
||||
elif [ -n "$WAN6" ]; then
|
||||
SERVER_IP_DEFAULT=$WAN6
|
||||
WARP_ENDPOINT=2606:4700:d0::a29f:c101
|
||||
DOMAIN_STRATEG=prefer_ipv6
|
||||
fi
|
||||
|
||||
# 检测是否解锁 chatGPT
|
||||
@@ -656,6 +659,15 @@ sing-box_variables() {
|
||||
SERVER_IP=${SERVER_IP:-"$SERVER_IP_DEFAULT"} && WS_SERVER_IP_SHOW=$SERVER_IP
|
||||
[ -z "$SERVER_IP" ] && error " $(text 47) "
|
||||
|
||||
# 根据服务 IP,使用不同的 warp 配置
|
||||
if [[ "$SERVER_IP" =~ : ]]; then
|
||||
WARP_ENDPOINT=2606:4700:d0::a29f:c101
|
||||
DOMAIN_STRATEG=prefer_ipv6
|
||||
else
|
||||
WARP_ENDPOINT=162.159.193.10
|
||||
DOMAIN_STRATEG=prefer_ipv4
|
||||
fi
|
||||
|
||||
# 如选择有 h. vmess + ws 或 i. vless + ws 时,先检测是否有支持的 http 端口可用,如有则要求输入域名和 cdn
|
||||
if [[ "${INSTALL_PROTOCOLS[@]}" =~ 'h' ]]; then
|
||||
if [ "$IS_ARGO" = 'is_argo' ]; then
|
||||
@@ -1623,7 +1635,7 @@ fetch_quicktunnel_domain() {
|
||||
fi
|
||||
[[ -z "$METRICS_ADDRESS" && "$CLOUDFLARED_PID" =~ ^[0-9]+$ ]] && METRICS_ADDRESS=$(ss -nltp | grep "pid=$CLOUDFLARED_PID" | awk '{print $4}')
|
||||
ARGO_DOMAIN=$(wget -qO- http://$METRICS_ADDRESS/quicktunnel | awk -F '"' '{print $4}')
|
||||
[[ ! "$ARGO_DOMAIN" =~ trycloudflare\.com$ ]] && (( QUICKTUNNEL_ERROR_TIME-- )) && sleep 1 || break
|
||||
[[ ! "$ARGO_DOMAIN" =~ trycloudflare\.com$ ]] && (( QUICKTUNNEL_ERROR_TIME-- )) && sleep 2 || break
|
||||
[ "$QUICKTUNNEL_ERROR_TIME" = '0' ] && error " $(text 93) "
|
||||
done
|
||||
|
||||
@@ -1674,7 +1686,9 @@ EOF
|
||||
check_install
|
||||
sleep 1
|
||||
check_sing-box_status
|
||||
[ "$IS_ARGO" = 'is_argo' ] && check_argo_status
|
||||
if [ "$IS_ARGO" = 'is_argo' ]; then
|
||||
[ "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ] && cmd_systemctl enable argo || check_argo_status
|
||||
fi
|
||||
}
|
||||
|
||||
export_list() {
|
||||
@@ -1703,7 +1717,7 @@ export_list() {
|
||||
fi
|
||||
|
||||
# 使用 Argo 时,获取临时隧道域名
|
||||
ls /etc/sing-box/conf/*-ws*inbounds.json >/dev/null 2>&1 && [ -z "$ARGO_DOMAIN" ] && [ "${STATUS[1]}" = "$(text 28)" ] && fetch_quicktunnel_domain
|
||||
ls $WORK_DIR/conf/*-ws*inbounds.json >/dev/null 2>&1 && [ "$IS_ARGO" = 'is_argo' ] && [ -z "$ARGO_DOMAIN" ] && [[ "${STATUS[1]}" = "$(text 28)" || "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]] && fetch_quicktunnel_domain
|
||||
|
||||
# 如果使用 Json 或者 Token Argo,则使用加密的而且是固定的 Argo 隧道域名,否则使用 IP:PORT 的 http 服务
|
||||
[[ "$ARGO_TYPE" = 'is_token_argo' || "$ARGO_TYPE" = 'is_json_argo' ]] && SUBSCRIBE_ADDRESS="https://$ARGO_DOMAIN" || SUBSCRIBE_ADDRESS="http://${SERVER_IP_1}:${PORT_NGINX}"
|
||||
@@ -1738,7 +1752,7 @@ export_list() {
|
||||
$CLASH_TROJAN
|
||||
"
|
||||
if [ -n "$PORT_VMESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
local CLASH_VMESS_WS="- {name: \"${NODE_NAME[17]} ${NODE_TAG[6]}\", type: vmess, server: ${CDN[17]}, port: 80, uuid: ${UUID[17]}, udp: true, tls: false, alterId: 0, cipher: none, skip-cert-verify: true, network: ws, ws-opts: { path: \"/$VMESS_WS_PATH\", headers: {Host: $ARGO_DOMAIN} }, smux: { enabled: true, protocol: 'h2mux', padding: true, max-connections: '8', min-streams: '16', statistic: true, only-tcp: false } }" &&
|
||||
local CLASH_SUBSCRIBE+="
|
||||
$CLASH_VMESS_WS
|
||||
@@ -1758,7 +1772,7 @@ export_list() {
|
||||
fi
|
||||
|
||||
if [ -n "$PORT_VLESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
local CLASH_VLESS_WS="- {name: \"${NODE_NAME[18]} ${NODE_TAG[7]}\", type: vless, server: ${CDN[18]}, port: 443, uuid: ${UUID[18]}, udp: true, tls: true, servername: $ARGO_DOMAIN, network: ws, skip-cert-verify: true, ws-opts: { path: \"/$VLESS_WS_PATH\", headers: {Host: $ARGO_DOMAIN}, max-early-data: 2048, early-data-header-name: Sec-WebSocket-Protocol }, smux: { enabled: true, protocol: 'h2mux', padding: true, max-connections: '8', min-streams: '16', statistic: true, only-tcp: false } }" &&
|
||||
local CLASH_SUBSCRIBE+="
|
||||
$CLASH_VLESS_WS
|
||||
@@ -1822,7 +1836,7 @@ ss://$(echo -n "${SHADOWSOCKS_METHOD}:${UUID[15]}@${SERVER_IP_2}:$PORT_SHADOWSOC
|
||||
trojan://$TROJAN_PASSWORD@${SERVER_IP_1}:$PORT_TROJAN?allowInsecure=1#${NODE_NAME[16]}%20${NODE_TAG[5]}
|
||||
"
|
||||
if [ -n "$PORT_VMESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
local SHADOWROCKET_SUBSCRIBE+="
|
||||
----------------------------
|
||||
vmess://$(echo -n "none:${UUID[17]}@${CDN[17]}:80" | base64 -w0)?remarks=${NODE_NAME[17]}%20${NODE_TAG[6]}&obfsParam=$ARGO_DOMAIN&path=/$VMESS_WS_PATH&obfs=websocket&alterId=0
|
||||
@@ -1841,7 +1855,7 @@ vmess://$(echo -n "none:${UUID[17]}@${CDN[17]}:80" | base64 -w0)?remarks=${NODE_
|
||||
fi
|
||||
|
||||
if [ -n "$PORT_VLESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
local SHADOWROCKET_SUBSCRIBE+="
|
||||
----------------------------
|
||||
vless://$(echo -n "auto:${UUID[18]}@${CDN[18]}:443" | base64 -w0)?remarks=${NODE_NAME[18]}%20${NODE_TAG[7]}&obfsParam=$ARGO_DOMAIN&path=/$VLESS_WS_PATH?ed=2048&obfs=websocket&tls=1&peer=$ARGO_DOMAIN&allowInsecure=1
|
||||
@@ -1948,7 +1962,7 @@ trojan://$TROJAN_PASSWORD@${SERVER_IP_1}:$PORT_TROJAN?security=tls&type=tcp&head
|
||||
# $(text 70)"
|
||||
|
||||
if [ -n "$PORT_VMESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
local V2RAYN_SUBSCRIBE+="
|
||||
----------------------------
|
||||
vmess://$(echo -n "{ \"v\": \"2\", \"ps\": \"${NODE_NAME[17]} ${NODE_TAG[6]}\", \"add\": \"${CDN[18]}\", \"port\": \"80\", \"id\": \"${UUID[18]}\", \"aid\": \"0\", \"scy\": \"none\", \"net\": \"ws\", \"type\": \"none\", \"host\": \"$ARGO_DOMAIN\", \"path\": \"/$VMESS_WS_PATH\", \"tls\": \"\", \"sni\": \"\", \"alpn\": \"\" }" | base64 -w0)"
|
||||
@@ -1966,7 +1980,7 @@ vmess://$(echo -n "{ \"v\": \"2\", \"ps\": \"${NODE_NAME[17]} ${NODE_TAG[6]}\",
|
||||
fi
|
||||
|
||||
if [ -n "$PORT_VLESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
local V2RAYN_SUBSCRIBE+="
|
||||
----------------------------
|
||||
vless://${UUID[18]}@${CDN[18]}:443?encryption=none&security=tls&sni=$ARGO_DOMAIN&type=ws&host=$ARGO_DOMAIN&path=%2F$VLESS_WS_PATH%3Fed%3D2048#${NODE_NAME[18]// /%20}%20${NODE_TAG[7]}"
|
||||
@@ -2021,7 +2035,7 @@ ss://$(echo -n "${SHADOWSOCKS_METHOD}:${UUID[15]}" | base64 -w0)@${SERVER_IP_1}:
|
||||
trojan://$TROJAN_PASSWORD@${SERVER_IP_1}:$PORT_TROJAN?security=tls&allowInsecure=1&fp=random&type=tcp#${NODE_NAME[16]} ${NODE_TAG[5]}"
|
||||
|
||||
if [ -n "$PORT_VMESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
NEKOBOX_SUBSCRIBE+="
|
||||
----------------------------
|
||||
vmess://$(echo -n "{\"add\":\"${CDN[17]}\",\"aid\":\"0\",\"host\":\"$ARGO_DOMAIN\",\"id\":\"${UUID[17]}\",\"net\":\"ws\",\"path\":\"/$VMESS_WS_PATH\",\"port\":\"80\",\"ps\":\"${NODE_NAME[17]} ${NODE_TAG[6]}\",\"scy\":\"none\",\"sni\":\"\",\"tls\":\"\",\"type\":\"\",\"v\":\"2\"}" | base64 -w0)"
|
||||
@@ -2039,7 +2053,7 @@ vmess://$(echo -n "{\"add\":\"${CDN[17]}\",\"aid\":\"0\",\"host\":\"$VMESS_HOST_
|
||||
fi
|
||||
|
||||
if [ -n "$PORT_VLESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
local NEKOBOX_SUBSCRIBE+="
|
||||
----------------------------
|
||||
vless://${UUID[18]}@${CDN[18]}:443?security=tls&sni=$ARGO_DOMAIN&type=ws&path=/$VLESS_WS_PATH?ed%3D2048&host=$ARGO_DOMAIN&encryption=none#${NODE_NAME[18]}%20${NODE_TAG[7]}"
|
||||
@@ -2094,7 +2108,7 @@ vless://${UUID[20]}@${SERVER_IP_1}:${PORT_GRPC_REALITY}?security=reality&sni=${T
|
||||
local NODE_REPLACE+="\"${NODE_NAME[16]} ${NODE_TAG[5]}\","
|
||||
|
||||
if [ -n "$PORT_VMESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
local INBOUND_REPLACE+=" { \"type\": \"vmess\", \"tag\": \"${NODE_NAME[17]} ${NODE_TAG[6]}\", \"server\":\"${CDN[17]}\", \"server_port\":80, \"uuid\":\"${UUID[17]}\", \"transport\": { \"type\":\"ws\", \"path\":\"/$VMESS_WS_PATH\", \"headers\": { \"Host\": \"$ARGO_DOMAIN\" } }, \"multiplex\": { \"enabled\":true, \"protocol\":\"h2mux\", \"max_streams\":16, \"padding\": true, \"brutal\":{ \"enabled\":true, \"up_mbps\":1000, \"down_mbps\":1000 } } }," && local NODE_REPLACE+="\"${NODE_NAME[17]} ${NODE_TAG[6]}\","
|
||||
[ "$ARGO_TYPE" = 'is_token_argo' ] && [ -z "$PROMPT" ] && local PROMPT="
|
||||
# $(text 94)"
|
||||
@@ -2110,7 +2124,7 @@ vless://${UUID[20]}@${SERVER_IP_1}:${PORT_GRPC_REALITY}?security=reality&sni=${T
|
||||
fi
|
||||
|
||||
if [ -n "$PORT_VLESS_WS" ]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]]; then
|
||||
if [[ "${STATUS[1]}" =~ $(text 27)|$(text 28) ]] || [[ "$IS_ARGO" = 'is_argo' && "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]]; then
|
||||
local INBOUND_REPLACE+=" { \"type\": \"vless\", \"tag\": \"${NODE_NAME[18]} ${NODE_TAG[7]}\", \"server\":\"${CDN[18]}\", \"server_port\":443, \"uuid\":\"${UUID[18]}\", \"tls\": { \"enabled\":true, \"server_name\":\"$ARGO_DOMAIN\", \"utls\": { \"enabled\":true, \"fingerprint\":\"chrome\" } }, \"transport\": { \"type\":\"ws\", \"path\":\"/$VLESS_WS_PATH\", \"headers\": { \"Host\": \"$ARGO_DOMAIN\" }, \"max_early_data\":2048, \"early_data_header_name\":\"Sec-WebSocket-Protocol\" }, \"multiplex\": { \"enabled\":true, \"protocol\":\"h2mux\", \"max_streams\":16, \"padding\": true, \"brutal\":{ \"enabled\":true, \"up_mbps\":1000, \"down_mbps\":1000 } } },"
|
||||
[ "$ARGO_TYPE" = 'is_token_argo' ] && [ -z "$PROMPT" ] && local PROMPT="
|
||||
# $(text 94)"
|
||||
@@ -2737,11 +2751,16 @@ statistics_of_run-times
|
||||
select_language
|
||||
check_system_info
|
||||
|
||||
# 可以是 Key Value 或者 Key=Value 的形式
|
||||
ALL_PARAMETER=($(sed -E 's/(-c|-e|-C|-E) //; ; s/=/ /g' <<< $*))
|
||||
# 可以是 Key Value 或者 Key=Value 的形式。传参时,
|
||||
# 传参处理1: 把所有的 = 变为空格,但保留 =" ,因为 Json TunnelSecret 是 =" 结尾的,如 {"AccountTag":"9cc9e3e4d8f29d2a02e297f14f20513a","TunnelSecret":"6AYfKBOoNlPiTAuWg64ZwujsNuERpWLm6pPJ2qpN8PM=","TunnelID":"1ac55430-f4dc-47d5-a850-bdce824c4101"}
|
||||
# 传参处理2: 去掉 sudo cloudflared service install ,以方便用户输入 Token 并能正确读取真正的以 ey 开头的 Value
|
||||
ALL_PARAMETER=($(sed -E 's/(-c|-e|-C|-E) //; s/=([^"])/ \1/g; s/sudo cloudflared service install //' <<< $*))
|
||||
[[ "${#ALL_PARAMETER[@]}" > 13 && "${ALL_PARAMETER[@]^^}" == *"--LANGUAGE"* && "${ALL_PARAMETER[@]^^}" == *"--CHOOSE_PROTOCOLS"* && "${ALL_PARAMETER[@]^^}" == *"--START_PORT"* && "${ALL_PARAMETER[@]^^}" == *"--PORT_NGINX"* && "${ALL_PARAMETER[@]^^}" == *"--SERVER_IP"* && "${ALL_PARAMETER[@]^^}" == *"--UUID"* && "${ALL_PARAMETER[@]^^}" == *"--NODE_NAME"* ]] && NONINTERACTIVE_INSTALL=noninteractive_install
|
||||
|
||||
# 传参处理,无交互快速安装参数
|
||||
# 预设默认值
|
||||
IS_SUB=no_sub
|
||||
IS_ARGO=no_argo
|
||||
for z in ${!ALL_PARAMETER[@]}; do
|
||||
case "${ALL_PARAMETER[z]^^}" in
|
||||
-P )
|
||||
@@ -2808,6 +2827,18 @@ for z in ${!ALL_PARAMETER[@]}; do
|
||||
done
|
||||
NODE_NAME_CONFIRM=${NODE_NAME_ARRAY[@]}
|
||||
;;
|
||||
--SUBSCRIBE )
|
||||
((z++)); [ "${ALL_PARAMETER[z]}" = 'true' ] && IS_SUB=is_sub
|
||||
;;
|
||||
--ARGO )
|
||||
((z++)); [ "${ALL_PARAMETER[z]}" = 'true' ] && IS_ARGO=is_argo
|
||||
;;
|
||||
--ARGO_DOMAIN )
|
||||
((z++)); ARGO_DOMAIN=${ALL_PARAMETER[z]}
|
||||
;;
|
||||
--ARGO_AUTH )
|
||||
((z++)); ARGO_AUTH=${ALL_PARAMETER[z]}
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
@@ -2820,6 +2851,7 @@ check_install
|
||||
if [ "$NONINTERACTIVE_INSTALL" = 'noninteractive_install' ]; then
|
||||
install_sing-box
|
||||
export_list install
|
||||
create_shortcut
|
||||
else
|
||||
menu_setting
|
||||
menu
|
||||
|
||||
Reference in New Issue
Block a user