diff --git a/menu.sh b/menu.sh index a8db489..6163f38 100644 --- a/menu.sh +++ b/menu.sh @@ -2,14 +2,14 @@ export LANG=en_US.UTF-8 # 当前脚本版本号和新增功能 -VERSION=2.42 +VERSION=2.43 declare -A T T[E0]="\n Language:\n 1.English (default) \n 2.简体中文\n" T[C0]="${T[E0]}" -T[E1]="1.Add shortcut hints in the menu; 2.Remove the shortcut of S. Single and dual stacks swithing can directly use [warp 4/6/d]" -T[C1]="1.在菜单中增加快捷方式的提示; 2.移除快捷方式 s,单双栈相互切换可以直接 [warp 4/6/d]" +T[E1]="1. Support NAT VPS" +T[C1]="1. 支持 NAT 服务器" T[E2]="The script must be run as root, you can enter sudo -i and then download and run again. Feedback: [https://github.com/fscarmen/warp/issues]" T[C2]="必须以root方式运行脚本,可以输入 sudo -i 后重新下载运行,问题反馈:[https://github.com/fscarmen/warp/issues]" T[E3]="The TUN module is not loaded. You should turn it on in the control panel. Ask the supplier for more help. Feedback: [https://github.com/fscarmen/warp/issues]" @@ -422,8 +422,8 @@ check_operating_system(){ # 安装 curl check_dependencies(){ - type -P curl >/dev/null 2>&1 || (yellow " ${T[${L}7]} " && ${PACKAGE_INSTALL[int]} curl) || (yellow " ${T[${L}8]} " && ${PACKAGE_UPDATE[int]} && ${PACKAGE_INSTALL[int]} curl) - ! type -P curl >/dev/null 2>&1 && red " ${T[${L}9]} " && exit 1 + type -p curl >/dev/null 2>&1 || (yellow " ${T[${L}7]} " && ${PACKAGE_INSTALL[int]} curl 2>/dev/null) || (yellow " ${T[${L}8]} " && ${PACKAGE_UPDATE[int]} && ${PACKAGE_INSTALL[int]} curl 2>/dev/null) + ! type -p curl >/dev/null 2>&1 && red " ${T[${L}9]} " && exit 1 [[ $SYSTEM = Alpine ]] && ! type -P curl >/dev/null 2>&1 && ${PACKAGE_UPDATE[int]} && ${PACKAGE_INSTALL[int]} curl wget grep } @@ -431,7 +431,6 @@ check_dependencies(){ ip4_info(){ unset IP4 LAN4 COUNTRY4 ASNORG4 TRACE4 PLUS4 WARPSTATUS4 IP4=$(curl -ks4m8 https://ip.gs/json $INTERFACE) - LAN4=$(ip route get 162.159.193.10 2>/dev/null | grep -oP 'src \K\S+') WAN4=$(expr "$IP4" : '.*ip\":\"\([^"]*\).*') COUNTRY4=$(expr "$IP4" : '.*country\":\"\([^"]*\).*') ASNORG4=$(expr "$IP4" : '.*asn_org\":\"\([^"]*\).*') @@ -445,7 +444,6 @@ ip4_info(){ ip6_info(){ unset IP6 LAN6 COUNTRY6 ASNORG6 TRACE6 PLUS6 WARPSTATUS6 IP6=$(curl -ks6m8 https://ip.gs/json) - LAN6=$(ip route get 2606:4700:d0::a29f:c001 2>/dev/null | grep -oP 'src \K\S+') WAN6=$(expr "$IP6" : '.*ip\":\"\([^"]*\).*') COUNTRY6=$(expr "$IP6" : '.*country\":\"\([^"]*\).*') ASNORG6=$(expr "$IP6" : '.*asn_org\":\"\([^"]*\).*') @@ -859,23 +857,29 @@ check_stack(){ if [[ -e /etc/wireguard/wgcf.conf ]]; then grep -q "^#.*0\.\0\/0" /etc/wireguard/wgcf.conf && T4=0 || T4=1 grep -q "^#.*\:\:\/0" /etc/wireguard/wgcf.conf && T6=0 || T6=1 - else + else case "$TRACE4" in off ) T4='0';; 'on'|'plus' ) T4='1';; esac case "$TRACE6" in off ) T6='0';; 'on'|'plus' ) T6='1';; esac fi CASE=("@0" "0@" "0@0" "@1" "0@1" "1@" "1@0" "1@1") for ((m=0;m<${#CASE[@]};m++)); do [[ $T4@$T6 = ${CASE[m]} ]] && break; done NATIVE=("IPv6 only" "IPv4 only" "${T[${L}69]}") - CONF1=("014" "104" "114") - CONF2=("016" "106" "116") - CONF3=("01D" "10D" "11D") WARP_BEFORE=("" "" "" "WARP IPv6 only" "WARP IPv6" "WARP IPv4 only" "WARP IPv4" "${T[${L}70]}") WARP_AFTER1=("" "" "" "WARP IPv4" "WARP IPv4" "WARP IPv6" "WARP IPv6" "WARP IPv4") WARP_AFTER2=("" "" "" "${T[${L}70]}" "${T[${L}70]}" "${T[${L}70]}" "${T[${L}70]}" "WARP IPv6") TO1=("" "" "" "014" "014" "106" "106" "114") TO2=("" "" "" "01D" "01D" "10D" "10D" "116") - SHORTCUT1=("" "" "" "(warp-go 4)" "(warp-go 4)" "(warp-go 6)" "(warp-go 6)" "(warp-go 4)") - SHORTCUT2=("" "" "" "(warp-go d)" "(warp-go d)" "(warp-go d)" "(warp-go d)" "(warp-go 6)") + SHORTCUT1=("" "" "" "(warp 4)" "(warp 4)" "(warp 6)" "(warp 6)" "(warp 4)") + SHORTCUT2=("" "" "" "(warp d)" "(warp d)" "(warp d)" "(warp d)" "(warp 6)") + + # 判断用于检测 NAT VSP,以选择正确配置文件 + if [ "$m" -le 3 ]; then + NAT=("0@1" "0@1" "1@1") + for ((n=0;n<${#NAT[@]};n++)); do [ "$IPV4@$IPV6" = "${NAT[n]}" ] && break; done + CONF1=("014" "104" "114") + CONF2=("016" "106" "116") + CONF3=("01D" "10D" "11D") + fi } # 单双栈在线互换。先看菜单是否有选择,再看传参数值,再没有显示2个可选项 @@ -932,33 +936,30 @@ EOF fi fi - # 判断是否大陆 VPS。先尝试连接 CloudFlare WARP 服务的 Endpoint IP,如遇到 WARP 断网则先关闭、杀进程后重试一次,仍然不通则 WARP 项目不可用。 - ping6 -c2 -w8 2606:4700:d0::a29f:c001 >/dev/null 2>&1 && IPV6=1 && CDN=-6 || IPV6=0 - ping -c2 -W8 162.159.193.10 >/dev/null 2>&1 && IPV4=1 && CDN=-4 || IPV4=0 - if [[ $IPV4$IPV6 = 00 && -n $(wg 2>/dev/null) ]]; then - wg-quick down wgcf >/dev/null 2>&1 - kill -9 $(pgrep -f wireguard 2>/dev/null) - ping6 -c2 -w10 2606:4700:d0::a29f:c001 >/dev/null 2>&1 && IPV6=1 && CDN=-6 - ping -c2 -W10 162.159.193.10 >/dev/null 2>&1 && IPV4=1 && CDN=-4 - fi - - # 判断处理器架构 - case $(uname -m) in - aarch64 ) ARCHITECTURE=arm64; AMD64_ONLY="${T[${L}156]}";; - x86_64 ) ARCHITECTURE=amd64;; - s390x ) ARCHITECTURE=s390x; AMD64_ONLY="${T[${L}156]}";; - * ) red " $(eval echo "${T[${L}134]}") " && exit 1;; - esac + # 判断机器原生状态类型 + LAN4=$(ip route get 192.168.193.10 2>/dev/null | grep -oP 'src \K\S+') + LAN6=$(ip route get 2606:4700:d0::a29f:c001 2>/dev/null | grep -oP 'src \K\S+') + [ -n "$LAN4" ] && IPV4=1 || IPV4=0 + [ -n "$LAN6" ] && IPV6=1 || IPV6=0 + [ -n "$LAN4" ] && ping -c2 -W3 162.159.193.10 >/dev/null 2>&1 && CDN=-4 || CDN=-6 # 判断当前 IPv4 与 IPv6 ,IP归属 及 WARP 方案, Linux Client 是否开启 - [[ $IPV4 = 1 ]] && ip4_info - [[ $IPV6 = 1 ]] && ip6_info + [ "$IPV4" = 1 ] && ip4_info + [ "$IPV6" = 1 ] && ip6_info [[ $L = C && -n "$COUNTRY4" ]] && COUNTRY4=$(translate "$COUNTRY4") [[ $L = C && -n "$COUNTRY6" ]] && COUNTRY6=$(translate "$COUNTRY6") - + # 判断当前 WARP 状态,决定变量 PLAN,变量 PLAN 含义:1=单栈 2=双栈 3=WARP已开启 [[ $TRACE4$TRACE6 =~ on|plus ]] && PLAN=3 || PLAN=$((IPV4+IPV6)) + # 判断处理器架构 + case $(uname -m) in + aarch64 ) ARCHITECTURE=arm64; AMD64_ONLY="${T[${L}156]}";; + x86_64 ) ARCHITECTURE=amd64;; + s390x ) ARCHITECTURE=s390x; AMD64_ONLY="${T[${L}156]}";; + * ) red " $(eval echo "${T[${L}134]}") " && exit 1;; + esac + # 判断当前 Linux Client 状态,决定变量 CLIENT,变量 CLIENT 含义:0=未安装 1=已安装未激活 2=状态激活 3=Clinet proxy 已开启 5=Clinet warp 已开启 CLIENT=0 if type -P warp-cli >/dev/null 2>&1; then