diff --git a/install.sh b/install.sh index afc97b3..fa5ae20 100644 --- a/install.sh +++ b/install.sh @@ -872,11 +872,11 @@ get_ip() { [[ -z $ip ]] && ip=$(curl -4 -s myip.ipip.net | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}") [[ -z $ip ]] && echo -e "\n$red 这垃圾小鸡扔了吧!$none\n" && exit - v6ip=$(curl -6 -s https://ifconfig.co/ip) - [[ -z $v6ip ]] && v6ip=$(curl -6 -s https://api.ip.sb/ip) - [[ -z $v6ip ]] && v6ip=$(curl -6 -s https://ip.seeip.org) - [[ -z $v6ip ]] && v6ip=$(curl -6 -s http://icanhazip.com) - [[ -z $v6ip ]] && v6ip=$(curl -6 -s https://api.myip.com | cut -d\" -f4) + v6ip=$(curl -m 5 -6 -s https://ifconfig.co/ip) + [[ -z $v6ip ]] && v6ip=$(curl -m 5 -6 -s https://api.ip.sb/ip) + [[ -z $v6ip ]] && v6ip=$(curl -m 5 -6 -s https://ip.seeip.org) + [[ -z $v6ip ]] && v6ip=$(curl -m 5 -6 -s http://icanhazip.com) + [[ -z $v6ip ]] && v6ip=$(curl -m 5 -6 -s https://api.myip.com | cut -d\" -f4) } error() { diff --git a/src/init.sh b/src/init.sh index d961317..56ef7a1 100644 --- a/src/init.sh +++ b/src/init.sh @@ -79,11 +79,11 @@ get_ip() { [[ -z $ip ]] && ip=$(curl -4 -s myip.ipip.net | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}") [[ -z $ip ]] && echo -e "\n$red 这垃圾小鸡扔了吧!$none\n" && exit - v6ip=$(curl -6 -s https://ifconfig.co/ip) - [[ -z $v6ip ]] && v6ip=$(curl -6 -s https://api.ip.sb/ip) - [[ -z $v6ip ]] && v6ip=$(curl -6 -s https://ip.seeip.org) - [[ -z $v6ip ]] && v6ip=$(curl -6 -s http://icanhazip.com) - [[ -z $v6ip ]] && v6ip=$(curl -6 -s https://api.myip.com | cut -d\" -f4) + v6ip=$(curl -m 5 -6 -s https://ifconfig.co/ip) + [[ -z $v6ip ]] && v6ip=$(curl -m 5 -6 -s https://api.ip.sb/ip) + [[ -z $v6ip ]] && v6ip=$(curl -m 5 -6 -s https://ip.seeip.org) + [[ -z $v6ip ]] && v6ip=$(curl -m 5 -6 -s http://icanhazip.com) + [[ -z $v6ip ]] && v6ip=$(curl -m 5 -6 -s https://api.myip.com | cut -d\" -f4) } error() { diff --git a/v2ray.sh b/v2ray.sh index 62a09b2..a66a931 100644 --- a/v2ray.sh +++ b/v2ray.sh @@ -1,3108 +1,3108 @@ -#!/bin/bash - -red='\e[91m' -green='\e[92m' -yellow='\e[93m' -magenta='\e[95m' -cyan='\e[96m' -none='\e[0m' - -# Root -[[ $(id -u) != 0 ]] && echo -e " 哎呀……请使用 ${red}root ${none}用户运行 ${yellow}~(^_^) ${none}" && exit 1 - -_version="v3.08" - -cmd="apt-get" - -sys_bit=$(uname -m) - -if [[ $sys_bit == "i386" || $sys_bit == "i686" ]]; then - v2ray_bit="32" - v2arch="386" -elif [[ $sys_bit == "x86_64" ]]; then - v2ray_bit="64" - v2arch="amd64" -else - echo -e " 哈哈……这个 ${red}辣鸡脚本${none} 不支持你的系统。 ${yellow}(-_-) ${none}" && exit 1 -fi - -if [[ -f /usr/bin/yum ]]; then - - cmd="yum" - -fi - -backup="/etc/v2ray/233blog_v2ray_backup.conf" -ssraybackup="/etc/v2ray/233blog_ssray_backup.conf" - -if [[ -f /usr/bin/v2ray/v2ray && -f /etc/v2ray/config.json ]] && [[ -f $backup && -d /etc/v2ray/233boy/v2ray ]]; then - - . $backup - -elif [[ -f /usr/bin/v2ray/v2ray && -f /etc/v2ray/config.json ]] && [[ -f /etc/v2ray/233blog_v2ray_backup.txt && -d /etc/v2ray/233boy/v2ray ]]; then - - . /etc/v2ray/233boy/v2ray/tools/v1xx_to_v3xx.sh - -else - echo -e " 哎呀哎呀…… ${red}出错咯...请重新安装V2Ray${none} ${yellow}~(^_^) ${none}" && exit 1 -fi - -if [[ $mark != "v3" ]]; then - . /etc/v2ray/233boy/v2ray/tools/v3.sh -fi -if [[ $v2ray_transport -ge 18 ]]; then - dynamicPort=true - port_range="${v2ray_dynamicPort_start}-${v2ray_dynamicPort_end}" -fi -if [[ $path_status ]]; then - is_path=true -fi - -[[ -f $ssraybackup ]] && source $ssraybackup - -uuid=$(cat /proc/sys/kernel/random/uuid) -v2ray_server_config="/etc/v2ray/config.json" -v2ray_client_config="/etc/v2ray/233blog_v2ray_config.json" -v2ray_pid=$(pgrep -f /usr/bin/v2ray/v2ray) -caddy_pid=$(pgrep -f /usr/local/bin/caddy) -_v2ray_sh="/usr/local/sbin/v2ray" -v2ray_ver="$(/usr/bin/v2ray/v2ray -version | head -n 1 | cut -d " " -f2)" -. /etc/v2ray/233boy/v2ray/src/init.sh -systemd=true -# _test=true - -# site -_site="ddog.xyz" - -if [[ $v2ray_ver != v* ]]; then - v2ray_ver="v$v2ray_ver" -fi -if [[ ! -f $_v2ray_sh ]]; then - mv -f /usr/local/bin/v2ray $_v2ray_sh - chmod +x $_v2ray_sh - echo -e "\n $yellow 警告: 请重新登录 SSH 以避免出现 v2ray 命令未找到的情况。$none \n" && exit 1 -fi - -if [ $v2ray_pid ]; then - v2ray_status="$green正在运行$none" -else - v2ray_status="$red未在运行$none" -fi -if [[ $v2ray_transport == [45] && $caddy ]] && [[ $caddy_pid ]]; then - caddy_run_status="$green正在运行$none" -else - caddy_run_status="$red未在运行$none" -fi - -ssray_transports=( - "HTTP (Websocket)" - "HTTPS (Websocket TLS)" - "QUIC (udp)" -) - -_load transport.sh -ciphers=( - aes-128-cfb - aes-256-cfb - chacha20 - chacha20-ietf - aes-128-gcm - aes-256-gcm - chacha20-ietf-poly1305 -) - -get_transport_args() { - _load v2ray-info.sh - _v2_args -} -create_vmess_URL_config() { - - [[ -z $net ]] && get_transport_args - - if [[ $v2ray_transport == [45] ]]; then - cat >/etc/v2ray/vmess_qr.json <<-EOF - { - "v": "2", - "ps": "${_site}_${domain}", - "add": "${domain}", - "port": "443", - "id": "${v2ray_id}", - "aid": "${alterId}", - "net": "${net}", - "type": "none", - "host": "${domain}", - "path": "$_path", - "tls": "tls" - } - EOF - else - [[ -z $ip ]] && get_ip - cat >/etc/v2ray/vmess_qr.json <<-EOF - { - "v": "2", - "ps": "${_site}_${ip}", - "add": "${ip}", - "port": "${v2ray_port}", - "id": "${v2ray_id}", - "aid": "${alterId}", - "net": "${net}", - "type": "${header}", - "host": "${host}", - "path": "", - "tls": "" - } - EOF - if [[ $v6ip ]]; then - cat >/etc/v2ray/vmess_qrv6.json <<-EOF - { - "v": "2", - "ps": "${_site}_${v6ip}", - "add": "${ip}", - "port": "${v2ray_port}", - "id": "${v2ray_id}", - "aid": "${alterId}", - "net": "${net}", - "type": "${header}", - "host": "${host}", - "path": "", - "tls": "" - } - EOF - fi - fi -} -view_v2ray_traffic() { - _load v2ray-traffic.sh - echo - echo - v2_query_all - echo -} -view_v2ray_config_info() { - - _load v2ray-info.sh - _v2_args - _v2_info -} -get_shadowsocks_config() { - if [[ $shadowsocks ]]; then - - while :; do - echo - echo -e "$yellow 1. $none查看 Shadowsocks 配置信息" - echo - echo -e "$yellow 2. $none生成二维码链接" - echo - read -p "$(echo -e "请选择 [${magenta}1-2$none]:")" _opt - if [[ -z $_opt ]]; then - error - else - case $_opt in - 1) - view_shadowsocks_config_info - break - ;; - 2) - get_shadowsocks_config_qr_link - break - ;; - *) - error - ;; - esac - fi - - done - else - shadowsocks_config - fi -} -view_shadowsocks_config_info() { - if [[ $shadowsocks ]]; then - _load ss-info.sh - else - shadowsocks_config - fi -} -get_shadowsocks_config_qr_link() { - if [[ $shadowsocks ]]; then - echo - echo -e "$green 正在生成链接.... 稍等片刻即可....$none" - echo - get_ip - local ss="ss://$(echo -n "${ssciphers}:${sspass}@${ip}:${ssport}" | base64 -w 0)#${_site}_ss_${ip}" - echo "${ss}" >/tmp/233blog_shadowsocks.txt - cat /tmp/233blog_shadowsocks.txt | qrencode -s 50 -o /tmp/233blog_shadowsocks.png - - local random=$(echo $RANDOM-$RANDOM-$RANDOM | base64 -w 0) - local link=$(curl -s --upload-file /tmp/233blog_shadowsocks.png "https://transfer.sh/${random}_v2ray6_shadowsocks.png") - if [[ $link ]]; then - echo - echo "---------- Shadowsocks 二维码链接 -------------" - echo - echo -e "$yellow 链接 = $cyan$link$none" - echo - echo -e " 温馨提示...$red Shadowsocks Win 4.0.6 $none客户端可能无法识别该二维码" - echo - echo "备注...链接将在 14 天后失效" - echo - echo "提醒...请不要把链接分享出去...除非你有特别的理由...." - echo - else - echo - echo -e "$red 哎呀呀呀...出错咯...请重试$none" - echo - fi - rm -rf /tmp/233blog_shadowsocks.png - rm -rf /tmp/233blog_shadowsocks.txt - else - shadowsocks_config - fi - -} - -change_shadowsocks_config() { - if [[ $shadowsocks ]]; then - - while :; do - echo - echo -e "$yellow 1. $none修改 Shadowsocks 端口" - echo - echo -e "$yellow 2. $none修改 Shadowsocks 密码" - echo - echo -e "$yellow 3. $none修改 Shadowsocks 加密协议" - echo - echo -e "$yellow 4. $none修改 Shadowsocks - V2rayPlugin 配置" - echo - echo -e "$yellow 5. $none关闭 Shadowsocks" - echo - read -p "$(echo -e "请选择 [${magenta}1-5$none]:")" _opt - if [[ -z $_opt ]]; then - error - else - case $_opt in - 1) - change_shadowsocks_port - break - ;; - 2) - change_shadowsocks_password - break - ;; - 3) - change_shadowsocks_ciphers - break - ;; - 4) - change_ssray_config - break - ;; - 5) - disable_shadowsocks - break - ;; - *) - error - ;; - esac - fi - - done - else - - shadowsocks_config - fi -} -shadowsocks_config() { - echo - echo - echo -e " $red大佬...你没有配置 Shadowsocks $none...不过现在想要配置的话也是可以的 ^_^" - echo - echo - - while :; do - echo -e "是否配置 ${yellow}Shadowsocks${none} [${magenta}Y/N$none]" - read -p "$(echo -e "(默认 [${cyan}N$none]):") " install_shadowsocks - [[ -z "$install_shadowsocks" ]] && install_shadowsocks="n" - if [[ "$install_shadowsocks" == [Yy] ]]; then - echo - shadowsocks=true - shadowsocks_port_config - shadowsocks_password_config - shadowsocks_ciphers_config - pause - open_port $new_ssport - backup_config +ss - ssport=$new_ssport - sspass=$new_sspass - ssciphers=$new_ssciphers - config - clear - view_shadowsocks_config_info - break - elif [[ "$install_shadowsocks" == [Nn] ]]; then - echo - echo -e " $green已取消配置 Shadowsocks ....$none" - echo - break - else - error - fi - - done -} -shadowsocks_port_config() { - local random=$(shuf -i20001-65535 -n1) - while :; do - echo -e "请输入 "$yellow"Shadowsocks"$none" 端口 ["$magenta"1-65535"$none"],不能和 "$yellow"V2ray"$none" 端口相同" - read -p "$(echo -e "(默认端口: ${cyan}${random}$none):") " new_ssport - [ -z "$new_ssport" ] && new_ssport=$random - case $new_ssport in - $v2ray_port) - echo - echo -e " 不能和$cyan V2Ray 端口 $none一毛一样...." - echo - echo -e " 当前 V2Ray 端口:${cyan}$v2ray_port${none}" - error - ;; - [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) - if [[ $v2ray_transport == [45] ]]; then - local tls=true - fi - if [[ $tls && $new_ssport == "80" ]] || [[ $tls && $new_ssport == "443" ]]; then - echo - echo -e "由于你当前已使用了 "$green"WebSocket + TLS $none或$green HTTP/2"$none" 传输协议." - echo - echo -e "所以不能选择 "$magenta"80"$none" 或 "$magenta"443"$none" 端口" - error - elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start == $new_ssport || $v2ray_dynamicPort_end == $new_ssport ]]; then - echo - echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" - error - elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start -lt $new_ssport && $new_ssport -le $v2ray_dynamicPort_end ]]; then - echo - echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" - error - elif [[ $socks && $new_ssport == $socks_port ]]; then - echo - echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" - error - elif [[ $mtproto && $new_ssport == $mtproto_port ]]; then - echo - echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" - error - else - echo - echo - echo -e "$yellow Shadowsocks 端口 = $cyan$new_ssport$none" - echo "----------------------------------------------------------------" - echo - break - fi - ;; - *) - error - ;; - esac - - done - -} - -shadowsocks_password_config() { - - while :; do - echo -e "请输入 "$yellow"Shadowsocks"$none" 密码" - read -p "$(echo -e "(默认密码: ${cyan}233blog.com$none)"): " new_sspass - [ -z "$new_sspass" ] && new_sspass="233blog.com" - case $new_sspass in - *[/$]*) - echo - echo -e " 由于这个脚本太辣鸡了..所以密码不能包含$red / $none或$red $ $none这两个符号.... " - echo - error - ;; - *) - echo - echo - echo -e "$yellow Shadowsocks 密码 = $cyan$new_sspass$none" - echo "----------------------------------------------------------------" - echo - break - ;; - esac - - done - -} - -shadowsocks_ciphers_config() { - - while :; do - echo -e "请选择 "$yellow"Shadowsocks"$none" 加密协议 [${magenta}1-7$none]" - for ((i = 1; i <= ${#ciphers[*]}; i++)); do - ciphers_show="${ciphers[$i - 1]}" - echo - echo -e "$yellow $i. $none${ciphers_show}" - done - echo - read -p "$(echo -e "(默认加密协议: ${cyan}${ciphers[6]}$none)"):" ssciphers_opt - [ -z "$ssciphers_opt" ] && ssciphers_opt=7 - case $ssciphers_opt in - [1-7]) - new_ssciphers=${ciphers[$ssciphers_opt - 1]} - echo - echo - echo -e "$yellow Shadowsocks 加密协议 = $cyan${new_ssciphers}$none" - echo "----------------------------------------------------------------" - echo - break - ;; - *) - error - ;; - esac - - done -} - -change_shadowsocks_port() { - echo - while :; do - echo -e "请输入 "$yellow"Shadowsocks"$none" 端口 ["$magenta"1-65535"$none"]" - read -p "$(echo -e "(当前端口: ${cyan}$ssport$none):") " new_ssport - [ -z "$new_ssport" ] && error && continue - case $new_ssport in - $ssport) - echo - echo " 跟当前端口一毛一样....修改个鸡鸡哦" - error - ;; - $v2ray_port) - echo - echo -e " 不能和$cyan V2Ray 端口 $none一毛一样...." - error - ;; - [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) - if [[ $v2ray_transport == [45] ]]; then - local tls=true - fi - if [[ $tls && $new_ssport == "80" ]] || [[ $tls && $new_ssport == "443" ]]; then - echo - echo -e "由于你已选择了 "$green"WebSocket + TLS $none或$green HTTP/2"$none" 传输协议." - echo - echo -e "所以不能选择 "$magenta"80"$none" 或 "$magenta"443"$none" 端口" - error - elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start == $new_ssport || $v2ray_dynamicPort_end == $new_ssport ]]; then - echo - echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" - error - elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start -lt $new_ssport && $new_ssport -le $v2ray_dynamicPort_end ]]; then - echo - echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" - error - elif [[ $socks && $new_ssport == $socks_port ]]; then - echo - echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" - error - elif [[ $mtproto && $new_ssport == $mtproto_port ]]; then - echo - echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" - error - else - echo - echo - echo -e "$yellow Shadowsocks 端口 = $cyan$new_ssport$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config ssport - del_port $ssport - open_port $new_ssport - ssport=$new_ssport - config - clear - view_shadowsocks_config_info - break - fi - ;; - *) - error - ;; - esac - - done -} -change_shadowsocks_password() { - echo - while :; do - echo -e "请输入 "$yellow"Shadowsocks"$none" 密码" - read -p "$(echo -e "(当前密码:${cyan}$sspass$none)"): " new_sspass - [ -z "$new_sspass" ] && error && continue - case $new_sspass in - $sspass) - echo - echo " 跟当前密码一毛一样....修改个鸡鸡哦" - error - ;; - *[/$]*) - echo - echo -e " 由于这个脚本太辣鸡了..所以密码不能包含$red / $none或$red $ $none这两个符号.... " - echo - error - ;; - *) - echo - echo - echo -e "$yellow Shadowsocks 密码 = $cyan$new_sspass$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config sspass - sspass=$new_sspass - config - clear - view_shadowsocks_config_info - break - ;; - esac - - done - -} - -change_shadowsocks_ciphers() { - echo - while :; do - echo -e "请选择 "$yellow"Shadowsocks"$none" 加密协议 [${magenta}1-${#ciphers[*]}$none]" - for ((i = 1; i <= ${#ciphers[*]}; i++)); do - ciphers_show="${ciphers[$i - 1]}" - echo - echo -e "$yellow $i. $none${ciphers_show}" - done - echo - read -p "$(echo -e "(当前加密协议: ${cyan}${ssciphers}$none)"):" ssciphers_opt - [ -z "$ssciphers_opt" ] && error && continue - case $ssciphers_opt in - [1-7]) - new_ssciphers=${ciphers[$ssciphers_opt - 1]} - if [[ $new_ssciphers == $ssciphers ]]; then - echo - echo " 跟当前加密协议一毛一样....修改个鸡鸡哦" - error && continue - fi - echo - echo - echo -e "$yellow Shadowsocks 加密协议 = $cyan${new_ssciphers}$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config ssciphers - ssciphers=$new_ssciphers - config - clear - view_shadowsocks_config_info - break - ;; - *) - error - ;; - esac - - done - -} -disable_shadowsocks() { - echo - - while :; do - echo -e "是否关闭 ${yellow}Shadowsocks${none} [${magenta}Y/N$none]" - read -p "$(echo -e "(默认 [${cyan}N$none]):") " y_n - [[ -z "$y_n" ]] && y_n="n" - if [[ "$y_n" == [Yy] ]]; then - echo - echo - echo -e "$yellow 关闭 Shadowsocks = $cyan是$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config -ss - del_port $ssport - shadowsocks='' - config - # clear - echo - echo - echo - echo -e "$green Shadowsocks 已关闭...不过你也可以随时重新启用 Shadowsocks ...只要你喜欢$none" - echo - break - elif [[ "$y_n" == [Nn] ]]; then - echo - echo -e " $green已取消关闭 Shadowsocks ....$none" - echo - break - else - error - fi - - done -} - -ssray_config() { - echo - echo - echo -e " $red大佬...你没有配置 Shadowsocks - V2ray - Plugin $none...不过现在想要配置的话也是可以的 ^_^" - echo - echo - - while :; do - echo -e "是否配置 ${yellow}Shadowsocks - V2ray Plugin ${none} [${magenta}Y/N$none]" - echo - echo - echo -e "${yellow}注:v2ray-plugin 跟v2ray 是互相独立的程序,眉有关系。${none}" - echo - echo -e "${yellow} v2ray-plugin 跟原版shadowsocks同时服务 ${none}" - echo - echo - read -p "$(echo -e "(默认 [${cyan}N$none]):") " install_ssray - [[ -z "$install_ssray" ]] && install_ssray="n" - if [[ "$install_ssray" == [Yy] ]]; then - echo - ssray=true - ssray_port_config - ssray_proto_config - break - elif [[ "$install_ssray" == [Nn] ]]; then - break - else - error - fi - - done - - _download_ssray_file - ssray_apply_config - ssray_save_config - _load ss-info.sh -} - -ssray_port_config() { - local random=$(shuf -i20001-65535 -n1) - while :; do - echo -e "请输入 "$yellow"Shadowsocks - v2ray-plugin"$none" 端口 ["$magenta"1-65535"$none"],不能和 "$yellow"V2Ray / shadowsocks "$none" 端口相同" - read -p "$(echo -e "(默认端口: ${cyan}${random}$none):") " ssrayport - [ -z "$ssrayport" ] && ssrayport=$random - case $ssrayport in - $ssport) - echo - echo " 不能和 Shadowsocks 端口一毛一样...." - error - ;; - $v2ray_port) - echo - echo " 不能和 V2Ray 端口一毛一样...." - error - ;; - [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) - if [[ $tls && $ssrayport == "80" ]] || [[ $tls && $ssrayport == "443" ]]; then - echo - echo -e "由于你已选择了 "$green"WebSocket + TLS $none或$green HTTP/2"$none" 传输协议." - echo - echo -e "所以不能选择 "$magenta"80"$none" 或 "$magenta"443"$none" 端口" - error - elif [[ $v2ray_dynamic_port_start_input == $ssrayport || $v2ray_dynamic_port_end_input == $ssrayport ]]; then - local multi_port="${v2ray_dynamic_port_start_input} - ${v2ray_dynamic_port_end_input}" - echo - echo " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:$multi_port" - error - elif [[ $v2ray_dynamic_port_start_input -lt $ssrayport && $ssrayport -le $v2ray_dynamic_port_end_input ]]; then - local multi_port="${v2ray_dynamic_port_start_input} - ${v2ray_dynamic_port_end_input}" - echo - echo " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:$multi_port" - error - else - echo - echo - echo -e "$yellow Shadowsocks v2ray-plugin 端口 = $cyan$ssrayport$none" - echo "----------------------------------------------------------------" - echo - break - fi - ;; - *) - error - ;; - esac - - done -} - -ssray_proto_config() { - - echo - while :; do - echo -e "请选择 "$yellow"V2Ray-Plugin"$none" 传输协议 [${magenta}1-${#transport[*]}$none]" - echo - for ((i = 1; i <= ${#ssray_transports[*]}; i++)); do - Stream="${ssray_transports[$i - 1]}" - echo -e "$yellow $i. $none${Stream}" - done - echo - echo -e "$yellow 备注: 2.HTTPS 3.QUIC 均要求严格验证【域名】与【证书】,需要解析至本机的公共域名 $none" - echo - read -p "$(echo -e "(默认协议: ${cyan}http$none)"):" ssray_transport - [ -z "$ssray_transport" ] && ssray_transport=1 - echo -e "$yellow V2Ray-Plugin 传输协议 = $cyan${ssray_transports[$ssray_transport - 1]}$none" - echo - echo - echo "----------------------------------------------------------------" - get_ip - case $ssray_transport in - 1) - ssrayopt="server" - ssray_domain=$ip - break - ;; - [2-3]) - while :; do - echo - echo -e "请输入一个 $magenta正确的域名$none,一定一定一定要正确,不!能!出!错!" - read -p "(例如:233blog.com): " ssray_domain - [ -z "$ssray_domain" ] && error && continue - echo - echo - echo -e "$yellow 你的域名 = $cyan$ssray_domain$none" - echo "----------------------------------------------------------------" - break - done - echo - echo - echo -e "$yellow 请将 $magenta$ssray_domain$none $yellow解析到: $cyan$ip$none" - echo - echo -e "$yellow 请将 $magenta$ssray_domain$none $yellow解析到: $cyan$ip$none" - echo - echo -e "$yellow 请将 $magenta$ssray_domain$none $yellow解析到: $cyan$ip$none" - echo "----------------------------------------------------------------" - echo - case $ssray_transport in - 2) - ssrayopt="server;tls;host=${ssray_domain}" - break - ;; - 3) - ssrayopt="server;mode=quic;host=${ssray_domain}" - break - ;; - esac - break - ;; - *) - error - ;; - esac - done - echo - echo - echo - if [[ $ssray_transport -gt 1 && $ssray_domain ]]; then - if [[ -f /root/.acme.sh/$ssray_domain/fullchain.cer && -f /root/.acme.sh/$ssray_domain/$ssray_domain.key ]]; then - echo -e "$yellow 噫!好像已经有证书了! 皮皮虾咋们走! $none" - else - echo -e "$yellow 开始安装acme.sh $none" - if ! command -v socat; then - echo -e "$red 需要安装socat $none" - exit 1 - fi - curl https://get.acme.sh | bash - - echo -e "$yellow 开始申请 $ssray_domain 的证书,如果有正在使用80端口的程序先让它们退下~... $none" - pkill caddy - pkill httpd - pkill nginx - sleep 3 - - if /root/.acme.sh/acme.sh --issue --standalone -d $ssray_domain ; then - echo -e "$yellow 好了搞定了。$none" - else - echo -e "$yellow 不知道什么鬼,上面的出错提示截图找人问吧!$none" - exit 1 - fi - fi - fi -} - -change_ssray_config() { - - _load download-ssray.sh - - if [[ $ssray ]]; then - - - while :; do - echo - echo -e "$yellow 1. $none修改 Shadowsocks - V2ray插件 端口" - echo - echo -e "$yellow 2. $none修改 Shadowsocks - V2ray插件 协议" - echo - echo -e "$yellow 3. $none升级 Shadowsocks - V2ray插件" - echo - echo -e "$yellow 4. $none关闭 Shadowsocks - V2ray" - echo - read -p "$(echo -e "请选择 [${magenta}1-3$none]:")" _opt - if [[ -z $_opt ]]; then - error - else - case $_opt in - 1) - local oldssrayport=$ssrayport - ssray_port_config - ssray_save_config - ssray_apply_config - del_port $oldssrayport - open_port $ssrayport - _load ss-info.sh - break - ;; - 2) - ssray_proto_config - ssray_save_config - ssray_apply_config - _load ss-info.sh - break - ;; - 3) - _update_ssray_version - ssray_save_config - break - ;; - 4) - del_port $ssrayport - _uninstall_ssray - ssray= - install_ssray=n - rm -f $ssraybackup - break - ;; - *) - error - ;; - esac - fi - - done - - else - ssray_config - fi -} - -ssray_save_config() { - cat > $ssraybackup << EOF -install_ssray=${install_ssray} -ssray_ver="$ssray_latest_ver" -ssray=${ssray} -ssray_transport=${ssray_transport} -ssrayport=${ssrayport} -ssray_domain="${ssray_domain}" -ssrayopt="${ssrayopt}" -EOF -} - -ssray_apply_config() { - _install_ssray_service - open_port $ssrayport - do_service restart ssray -} - -change_v2ray_config() { - local _menu=( - "修改 V2Ray 端口" - "修改 V2Ray 传输协议" - "修改 V2Ray 动态端口 (如果可以)" - "修改 用户ID ( UUID )" - "修改 TLS 域名 (如果可以)" - "修改 分流的路径 (如果可以)" - "修改 伪装的网址 (如果可以)" - "关闭 网站伪装 和 路径分流 (如果可以)" - "开启 / 关闭 广告拦截" - "增加 V2ray 用户" - ) - while :; do - for ((i = 1; i <= ${#_menu[*]}; i++)); do - if [[ "$i" -le 9 ]]; then - echo - echo -e "$yellow $i. $none${_menu[$i - 1]}" - else - echo - echo -e "$yellow $i. $none${_menu[$i - 1]}" - fi - done - echo - read -p "$(echo -e "请选择 [${magenta}1-${#_menu[*]}$none]:")" _opt - if [[ -z $_opt ]]; then - error - else - case $_opt in - 1) - change_v2ray_port - break - ;; - 2) - change_v2ray_transport - break - ;; - 3) - change_v2ray_dynamicport - break - ;; - 4) - change_v2ray_id - break - ;; - 5) - change_domain - break - ;; - 6) - change_path_config - break - ;; - 7) - change_proxy_site_config - break - ;; - 8) - disable_path - break - ;; - 9) - blocked_hosts - break - ;; - 10) - change_vmess_user - break - ;; - [aA][Ii][aA][Ii] | [Dd][Dd]) - custom_uuid - break - ;; - [Dd] | [Aa][Ii] | 233 | 233[Bb][Ll][Oo][Gg] | 233[Bb][Ll][Oo][Gg].[Cc][Oo][Mm] | 233[Bb][Oo][Yy] | [Aa][Ll][Tt][Ee][Rr][Ii][Dd]) - change_v2ray_alterId - break - ;; - *) - error - ;; - esac - fi - done -} - -change_vmess_user () { - echo - echo - - local uuid=$(cat /proc/sys/kernel/random/uuid) - local randomemail=${3:-${uuid:30}@233.com} - while :; do - echo -e "请输入 "$yellow"新用户AlterId$none (0~65535 整数)" - read -p "[默认:64]" new_alterId - [[ -z $new_alterId ]] && new_alterId=64 - if [[ $new_alterId =~ ^[0-9]+$ ]]; then - break; - else - _red "$new_alterId 是啥???" - fi - done - - echo -e "请输入 "$yellow"新用户 Email"$none"(任意字符,仅作统计识别)" - read -p "[默认:${randomemail}]" new_email - [[ -z $new_email ]] && new_email=$randomemail - - echo - echo - _load jqcmd.sh - jq_gen_jsonpatch - jq_vmess_adduser $uuid $new_alterId $new_email - jq_printvmess $ip "[233]" - [[ $v6ip ]] && jq_printvmess $v6ip "[233]" - jq_patchback - jq_clear_tmp - echo - echo - _yellow " ---- 搞定了。" - restart_v2ray - _yellow " ---- 翻查多用户的vmess link请用v2ray murl查看。" - _yellow " ---- 翻查各个用户的流量,可用v2ray traffic查看(重启v2ray后会清空)。" - echo - -} - -change_v2ray_port() { - if [[ $v2ray_transport == 4 ]]; then - echo - echo -e " 由于你目前使用的是$yellow WebSocket + TLS $none传输协议...所以修不修改 V2Ray 端口没有什么不一样的" - echo - echo " 如果你想要使用其他端口...可以先修改 V2Ray 的传输协议..之后再修改 V2Ray 端口" - echo - change_v2ray_transport_ask - elif [[ $v2ray_transport == 5 ]]; then - echo - echo -e " 由于你目前使用的是$yellow HTTP/2 $none传输协议...所以修不修改 V2Ray 端口没有什么不一样的" - echo - echo " 如果你想要使用其他端口...可以先修改 V2Ray 的传输协议..之后再修改 V2Ray 端口" - echo - change_v2ray_transport_ask - else - echo - while :; do - echo -e "请输入 "$yellow"V2Ray"$none" 端口 ["$magenta"1-65535"$none"]" - read -p "$(echo -e "(当前端口: ${cyan}${v2ray_port}$none):")" new_v2ray_port - [[ -z $new_v2ray_port ]] && error && continue - case $new_v2ray_port in - $v2ray_port) - echo - echo " 哎呀...跟当前端口一毛一样呀...修改个鸡鸡哦" - error - ;; - [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) - if [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start == $new_v2ray_port || $v2ray_dynamicPort_end == $new_v2ray_port ]]; then - echo - echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" - error - elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start -lt $new_v2ray_port && $new_v2ray_port -le $v2ray_dynamicPort_end ]]; then - echo - echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" - error - elif [[ $shadowsocks && $new_v2ray_port == $ssport ]]; then - echo - echo -e "抱歉, 此端口跟 Shadowsocks 端口冲突...当前 Shadowsocks 端口: ${cyan}$ssport$none" - error - elif [[ $socks && $new_v2ray_port == $socks_port ]]; then - echo - echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" - error - elif [[ $mtproto && $new_v2ray_port == $mtproto_port ]]; then - echo - echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" - error - else - echo - echo - echo -e "$yellow V2Ray 端口 = $cyan$new_v2ray_port$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config v2ray_port - del_port $v2ray_port - open_port $new_v2ray_port - v2ray_port=$new_v2ray_port - config - clear - view_v2ray_config_info - break - fi - ;; - *) - error - ;; - esac - - done - fi - -} -change_v2ray_transport_ask() { - echo - while :; do - echo -e "是否需要修改$yellow V2Ray $none传输协议 [${magenta}Y/N$none]" - read -p "$(echo -e "默认 [${cyan}N$none]:")" y_n - [ -z $y_n ] && break - if [[ $y_n == [Yy] ]]; then - change_v2ray_transport - break - elif [[ $y_n == [Nn] ]]; then - break - else - error - fi - done -} -change_v2ray_transport() { - echo - while :; do - echo -e "请选择 "$yellow"V2Ray"$none" 传输协议 [${magenta}1-${#transport[*]}$none]" - echo - for ((i = 1; i <= ${#transport[*]}; i++)); do - Stream="${transport[$i - 1]}" - if [[ "$i" -le 9 ]]; then - # echo - echo -e "$yellow $i. $none${Stream}" - else - # echo - echo -e "$yellow $i. $none${Stream}" - fi - done - echo - echo "备注1: 含有 [dynamicPort] 的即启用动态端口.." - echo "备注2: [utp | srtp | wechat-video | dtls | wireguard] 分别伪装成 [BT下载 | 视频通话 | 微信视频通话 | DTLS 1.2 数据包 | WireGuard 数据包]" - echo - read -p "$(echo -e "(当前传输协议: ${cyan}${transport[$v2ray_transport - 1]}$none)"):" new_v2ray_transport - if [ -z "$new_v2ray_transport" ]; then - error - else - case $new_v2ray_transport in - $v2ray_transport) - echo - echo " 哎呀...跟当前传输协议一毛一样呀...修改个鸡鸡哦" - error - ;; - 4 | 5) - if [[ $v2ray_port == "80" || $v2ray_port == "443" ]]; then - echo - echo -e " 抱歉...如果你想要使用${cyan} ${transport[$new_v2ray_transport - 1]} $none传输协议.. ${red}V2Ray 端口不能为 80 或者 443 ...$none" - echo - echo -e " 当前 V2Ray 端口: ${cyan}$v2ray_port$none" - error - elif [[ $shadowsocks ]] && [[ $ssport == "80" || $ssport == "443" ]]; then - echo - echo -e " 抱歉...如果你想要使用${cyan} ${transport[$new_v2ray_transport - 1]} $none传输协议.. ${red}Shadowsocks 端口不能为 80 或者 443 ...$none" - echo - echo -e " 当前 Shadowsocks 端口: ${cyan}$ssport$none" - error - elif [[ $socks ]] && [[ $socks_port == "80" || $socks_port == "443" ]]; then - echo - echo -e " 抱歉...如果你想要使用${cyan} ${transport[$new_v2ray_transport - 1]} $none传输协议.. ${red}Socks 端口不能为 80 或者 443 ...$none" - echo - echo -e " 当前 Socks 端口: ${cyan}$socks_port$none" - error - elif [[ $mtproto ]] && [[ $mtproto_port == "80" || $mtproto_port == "443" ]]; then - echo - echo -e " 抱歉...如果你想要使用${cyan} ${transport[$new_v2ray_transport - 1]} $none传输协议.. ${red}MTProto 端口不能为 80 或者 443 ...$none" - echo - echo -e " 当前 MTProto 端口: ${cyan}$mtproto_port$none" - error - else - echo - echo - echo -e "$yellow V2Ray 传输协议 = $cyan${transport[$new_v2ray_transport - 1]}$none" - echo "----------------------------------------------------------------" - echo - break - fi - ;; - [1-9] | [1-2][0-9] | 3[0-2]) - echo - echo - echo -e "$yellow V2Ray 传输协议 = $cyan${transport[$new_v2ray_transport - 1]}$none" - echo "----------------------------------------------------------------" - echo - break - ;; - *) - error - ;; - esac - fi - - done - pause - - if [[ $new_v2ray_transport == [45] ]]; then - tls_config - elif [[ $new_v2ray_transport -ge 18 ]]; then - v2ray_dynamic_port_start - v2ray_dynamic_port_end - pause - old_transport - open_port "multiport" - backup_config v2ray_transport v2ray_dynamicPort_start v2ray_dynamicPort_end - port_range="${v2ray_dynamic_port_start_input}-${v2ray_dynamic_port_end_input}" - v2ray_transport=$new_v2ray_transport - config - clear - view_v2ray_config_info - else - old_transport - backup_config v2ray_transport - v2ray_transport=$new_v2ray_transport - config - clear - view_v2ray_config_info - fi - -} -old_transport() { - if [[ $v2ray_transport == [45] ]]; then - del_port "80" - del_port "443" - if [[ $caddy && $caddy_pid ]]; then - do_service stop caddy - if [[ $systemd ]]; then - systemctl disable caddy >/dev/null 2>&1 - else - update-rc.d -f caddy remove >/dev/null 2>&1 - fi - elif [[ $caddy ]]; then - if [[ $systemd ]]; then - systemctl disable caddy >/dev/null 2>&1 - else - update-rc.d -f caddy remove >/dev/null 2>&1 - fi - fi - if [[ $is_path ]]; then - backup_config -path - fi - elif [[ $v2ray_transport -ge 18 ]]; then - del_port "multiport" - fi -} - -tls_config() { - while :; do - echo - echo - echo - echo -e "请输入一个 $magenta正确的域名$none,一定一定一定要正确,不!能!出!错!" - read -p "(例如:233blog.com): " new_domain - [ -z "$new_domain" ] && error && continue - echo - echo - echo -e "$yellow 你的域名 = $cyan$new_domain$none" - echo "----------------------------------------------------------------" - break - done - get_ip - echo - echo - echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" - echo - echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" - echo - echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" - echo "----------------------------------------------------------------" - echo - - while :; do - - read -p "$(echo -e "(是否已经正确解析: [${magenta}Y$none]):") " record - if [[ -z "$record" ]]; then - error - else - if [[ "$record" == [Yy] ]]; then - domain_check - echo - echo - echo -e "$yellow 域名解析 = ${cyan}我确定已经有解析了$none" - echo "----------------------------------------------------------------" - echo - break - else - error - fi - fi - - done - - if [[ $caddy ]]; then - path_config_ask - pause - # domain_check - backup_config v2ray_transport domain - if [[ $new_path ]]; then - backup_config +path - path=$new_path - proxy_site=$new_proxy_site - is_path=true - fi - - if [[ $v2ray_transport -ge 18 ]]; then - del_port "multiport" - fi - domain=$new_domain - - open_port "80" - open_port "443" - if [[ $systemd ]]; then - systemctl enable caddy >/dev/null 2>&1 - else - update-rc.d -f caddy defaults >/dev/null 2>&1 - fi - v2ray_transport=$new_v2ray_transport - caddy_config - config - clear - view_v2ray_config_info - else - if [[ $new_v2ray_transport == 5 ]]; then - path_config_ask - pause - domain_check - backup_config v2ray_transport domain caddy - if [[ $new_path ]]; then - backup_config +path - path=$new_path - proxy_site=$new_proxy_site - is_path=true - fi - if [[ $v2ray_transport -ge 18 ]]; then - del_port "multiport" - fi - domain=$new_domain - install_caddy - open_port "80" - open_port "443" - v2ray_transport=$new_v2ray_transport - caddy_config - config - caddy=true - clear - view_v2ray_config_info - else - auto_tls_config - fi - fi - -} -auto_tls_config() { - echo -e " - - 安装 Caddy 来实现 自动配置 TLS - - 如果你已经安装 Nginx 或 Caddy - - $yellow并且..自己能搞定配置 TLS$none - - 那么就不需要 打开自动配置 TLS - " - echo "----------------------------------------------------------------" - echo - - while :; do - - read -p "$(echo -e "(是否自动配置 TLS: [${magenta}Y/N$none]):") " auto_install_caddy - if [[ -z "$auto_install_caddy" ]]; then - error - else - if [[ "$auto_install_caddy" == [Yy] ]]; then - echo - echo - echo -e "$yellow 自动配置 TLS = $cyan打开$none" - echo "----------------------------------------------------------------" - echo - path_config_ask - pause - domain_check - backup_config v2ray_transport domain caddy - if [[ $new_path ]]; then - backup_config +path - path=$new_path - proxy_site=$new_proxy_site - is_path=true - fi - if [[ $v2ray_transport -ge 18 ]]; then - del_port "multiport" - fi - domain=$new_domain - install_caddy - open_port "80" - open_port "443" - v2ray_transport=$new_v2ray_transport - caddy_config - config - caddy=true - clear - view_v2ray_config_info - break - elif [[ "$auto_install_caddy" == [Nn] ]]; then - echo - echo - echo -e "$yellow 自动配置 TLS = $cyan关闭$none" - echo "----------------------------------------------------------------" - echo - pause - domain_check - backup_config v2ray_transport domain - if [[ $v2ray_transport -ge 18 ]]; then - del_port "multiport" - fi - domain=$new_domain - open_port "80" - open_port "443" - v2ray_transport=$new_v2ray_transport - config - clear - view_v2ray_config_info - break - else - error - fi - fi - - done -} - -path_config_ask() { - echo - while :; do - echo -e "是否开启 网站伪装 和 路径分流 [${magenta}Y/N$none]" - read -p "$(echo -e "(默认: [${cyan}N$none]):")" path_ask - [[ -z $path_ask ]] && path_ask="n" - - case $path_ask in - Y | y) - path_config - break - ;; - N | n) - echo - echo - echo -e "$yellow 网站伪装 和 路径分流 = $cyan不想配置$none" - echo "----------------------------------------------------------------" - echo - break - ;; - *) - error - ;; - esac - done -} -path_config() { - echo - while :; do - echo -e "请输入想要 ${magenta}用来分流的路径$none , 例如 /233blog , 那么只需要输入 233blog 即可" - read -p "$(echo -e "(默认: [${cyan}233blog$none]):")" new_path - [[ -z $new_path ]] && new_path="233blog" - - case $new_path in - *[/$]*) - echo - echo -e " 由于这个脚本太辣鸡了..所以分流的路径不能包含$red / $none或$red $ $none这两个符号.... " - echo - error - ;; - *) - echo - echo - echo -e "$yellow 分流的路径 = ${cyan}/${new_path}$none" - echo "----------------------------------------------------------------" - echo - break - ;; - esac - done - proxy_site_config -} -proxy_site_config() { - echo - while :; do - echo -e "请输入 ${magenta}一个正确的$none ${cyan}网址$none 用来作为 ${cyan}网站的伪装$none , 例如 https://liyafly.com" - echo -e "举例...假设你当前的域名是$green $domain $none, 伪装的网址的是 https://liyafly.com" - echo -e "然后打开你的域名时候...显示出来的内容就是来自 https://liyafly.com 的内容" - echo -e "其实就是一个反代...明白就好..." - echo -e "如果不能伪装成功...可以使用 v2ray config 修改伪装的网址" - read -p "$(echo -e "(默认: [${cyan}https://liyafly.com$none]):")" new_proxy_site - [[ -z $new_proxy_site ]] && new_proxy_site="https://liyafly.com" - - case $new_proxy_site in - *[#$]*) - echo - echo -e " 由于这个脚本太辣鸡了..所以伪装的网址不能包含$red # $none或$red $ $none这两个符号.... " - echo - error - ;; - *) - echo - echo - echo -e "$yellow 伪装的网址 = ${cyan}${new_proxy_site}$none" - echo "----------------------------------------------------------------" - echo - break - ;; - esac - done -} - -install_caddy() { - _load download-caddy.sh - _download_caddy_file - _install_caddy_service - -} -caddy_config() { - # local email=$(shuf -i1-10000000000 -n1) - _load caddy-config.sh - # systemctl restart caddy - do_service restart caddy -} -v2ray_dynamic_port_start() { - echo - echo - while :; do - echo -e "请输入 "$yellow"V2Ray 动态端口开始 "$none"范围 ["$magenta"1-65535"$none"]" - read -p "$(echo -e "(默认开始端口: ${cyan}10000$none):")" v2ray_dynamic_port_start_input - [ -z $v2ray_dynamic_port_start_input ] && v2ray_dynamic_port_start_input=10000 - case $v2ray_dynamic_port_start_input in - $v2ray_port) - echo - echo " 不能和 V2Ray 端口一毛一样...." - echo - echo -e " 当前 V2Ray 端口:${cyan}$v2ray_port${none}" - error - ;; - [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) - if [[ $shadowsocks && $v2ray_dynamic_port_start_input == $ssport ]]; then - echo - echo -e "抱歉, 此端口跟 Shadowsocks 端口冲突...当前 Shadowsocks 端口: ${cyan}$ssport$none" - error - elif [[ $socks && $v2ray_dynamic_port_start_input == $socks_port ]]; then - echo - echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" - error - elif [[ $mtproto && $v2ray_dynamic_port_start_input == $mtproto_port ]]; then - echo - echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" - error - else - echo - echo - echo -e "$yellow V2Ray 动态端口开始 = $cyan$v2ray_dynamic_port_start_input$none" - echo "----------------------------------------------------------------" - echo - break - fi - - ;; - *) - error - ;; - esac - - done - - if [[ $v2ray_dynamic_port_start_input -lt $v2ray_port ]]; then - lt_v2ray_port=true - fi - if [[ $shadowsocks ]] && [[ $v2ray_dynamic_port_start_input -lt $ssport ]]; then - lt_ssport=true - fi - if [[ $socks ]] && [[ $v2ray_dynamic_port_start_input -lt $socks_port ]]; then - lt_socks_port=true - fi - if [[ $mtproto ]] && [[ $v2ray_dynamic_port_start_input -lt $mtproto_port ]]; then - lt_mtproto_port=true - fi - -} - -v2ray_dynamic_port_end() { - echo - while :; do - echo -e "请输入 "$yellow"V2Ray 动态端口结束 "$none"范围 ["$magenta"1-65535"$none"]" - read -p "$(echo -e "(默认结束端口: ${cyan}20000$none):")" v2ray_dynamic_port_end_input - [ -z $v2ray_dynamic_port_end_input ] && v2ray_dynamic_port_end_input=20000 - case $v2ray_dynamic_port_end_input in - [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) - - if [[ $v2ray_dynamic_port_end_input -le $v2ray_dynamic_port_start_input ]]; then - echo - echo " 不能小于或等于 V2Ray 动态端口开始范围" - echo - echo -e " 当前 V2Ray 动态端口开始:${cyan}$v2ray_dynamic_port_start_input${none}" - error - elif [ $lt_v2ray_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $v2ray_port ]]; then - echo - echo " V2Ray 动态端口结束范围 不能包括 V2Ray 端口..." - echo - echo -e " 当前 V2Ray 端口: ${cyan}$v2ray_port$none" - error - elif [ $lt_ssport ] && [[ ${v2ray_dynamic_port_end_input} -ge $ssport ]]; then - echo - echo " V2Ray 动态端口结束范围 不能包括 Shadowsocks 端口..." - echo - echo -e " 当前 Shadowsocks 端口: ${cyan}$ssport$none" - error - elif [ $lt_socks_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $socks_port ]]; then - echo - echo " V2Ray 动态端口结束范围 不能包括 Socks 端口..." - echo - echo -e " 当前 Socks 端口: ${cyan}$socks_port$none" - error - elif [ $lt_mtproto_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $mtproto_port ]]; then - echo - echo " V2Ray 动态端口结束范围 不能包括 MTProto 端口..." - echo - echo -e " 当前 MTProto 端口: ${cyan}$mtproto_port$none" - error - else - echo - echo - echo -e "$yellow V2Ray 动态端口结束 = $cyan$v2ray_dynamic_port_end_input$none" - echo "----------------------------------------------------------------" - echo - break - fi - ;; - *) - error - ;; - esac - - done - -} -change_v2ray_dynamicport() { - if [[ $v2ray_transport -ge 18 ]]; then - change_v2ray_dynamic_port_start - change_v2ray_dynamic_port_end - pause - del_port "multiport" - open_port "multiport" - backup_config v2ray_dynamicPort_start v2ray_dynamicPort_end - port_range="${v2ray_dynamic_port_start_input}-${v2ray_dynamic_port_end_input}" - config - # clear - echo - echo -e "$green 动态端口修改成功啦...你不需要修改 V2Ray 客户端配置...保持原有的配置即可...$none" - echo - else - echo - echo -e "$red ...当前传输协议木有启用动态端口...$none" - echo - while :; do - echo -e "是否需要修改传输协议 [${magenta}Y/N$none]" - read -p "$(echo -e "默认 [${cyan}N$none]:")" y_n - if [[ -z $y_n ]]; then - echo - echo -e "$green 已取消修改传输协议...$none" - echo - break - else - if [[ $y_n == [Yy] ]]; then - change_v2ray_transport - break - elif [[ $y_n == [Nn] ]]; then - echo - echo -e "$green 已取消修改传输协议...$none" - echo - break - else - error - fi - fi - done - - fi -} -change_v2ray_dynamic_port_start() { - echo - echo - while :; do - echo -e "请输入 "$yellow"V2Ray 动态端口开始 "$none"范围 ["$magenta"1-65535"$none"]" - read -p "$(echo -e "(当前动态开始端口: ${cyan}$v2ray_dynamicPort_start$none):")" v2ray_dynamic_port_start_input - [ -z $v2ray_dynamic_port_start_input ] && error && continue - case $v2ray_dynamic_port_start_input in - $v2ray_port) - echo - echo " 不能和 V2Ray 端口一毛一样...." - echo - echo -e " 当前 V2Ray 端口:${cyan}$v2ray_port${none}" - error - ;; - [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) - if [[ $shadowsocks && $v2ray_dynamic_port_start_input == $ssport ]]; then - echo - echo -e "抱歉, 此端口跟 Shadowsocks 端口冲突...当前 Shadowsocks 端口: ${cyan}$ssport$none" - error - elif [[ $socks && $v2ray_dynamic_port_start_input == $socks_port ]]; then - echo - echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" - error - elif [[ $mtproto && $v2ray_dynamic_port_start_input == $mtproto_port ]]; then - echo - echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" - error - else - echo - echo - echo -e "$yellow V2Ray 动态端口开始 = $cyan$v2ray_dynamic_port_start_input$none" - echo "----------------------------------------------------------------" - echo - break - fi - - ;; - *) - error - ;; - esac - - done - - if [[ $v2ray_dynamic_port_start_input -lt $v2ray_port ]]; then - lt_v2ray_port=true - fi - if [[ $shadowsocks ]] && [[ $v2ray_dynamic_port_start_input -lt $ssport ]]; then - lt_ssport=true - fi - if [[ $socks ]] && [[ $v2ray_dynamic_port_start_input -lt $socks_port ]]; then - lt_socks_port=true - fi - if [[ $mtproto ]] && [[ $v2ray_dynamic_port_start_input -lt $mtproto_port ]]; then - lt_mtproto_port=true - fi -} - -change_v2ray_dynamic_port_end() { - echo - while :; do - echo -e "请输入 "$yellow"V2Ray 动态端口结束 "$none"范围 ["$magenta"1-65535"$none"]" - read -p "$(echo -e "(当前动态结束端口: ${cyan}$v2ray_dynamicPort_end$none):")" v2ray_dynamic_port_end_input - [ -z $v2ray_dynamic_port_end_input ] && error && continue - case $v2ray_dynamic_port_end_input in - [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) - - if [[ $v2ray_dynamic_port_end_input -le $v2ray_dynamic_port_start_input ]]; then - echo - echo " 不能小于或等于 V2Ray 动态端口开始范围" - echo - echo -e " 当前 V2Ray 动态端口开始:${cyan}$v2ray_dynamic_port_start_input${none}" - error - elif [ $lt_v2ray_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $v2ray_port ]]; then - echo - echo " V2Ray 动态端口结束范围 不能包括 V2Ray 端口..." - echo - echo -e " 当前 V2Ray 端口: ${cyan}$v2ray_port$none" - error - elif [ $lt_ssport ] && [[ ${v2ray_dynamic_port_end_input} -ge $ssport ]]; then - echo - echo " V2Ray 动态端口结束范围 不能包括 Shadowsocks 端口..." - echo - echo -e " 当前 Shadowsocks 端口: ${cyan}$ssport$none" - error - elif [ $lt_socks_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $socks_port ]]; then - echo - echo " V2Ray 动态端口结束范围 不能包括 Socks 端口..." - echo - echo -e " 当前 Socks 端口: ${cyan}$socks_port$none" - error - elif [ $lt_mtproto_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $mtproto_port ]]; then - echo - echo " V2Ray 动态端口结束范围 不能包括 MTProto 端口..." - echo - echo -e " 当前 MTProto 端口: ${cyan}$mtproto_port$none" - error - else - echo - echo - echo -e "$yellow V2Ray 动态端口结束 = $cyan$v2ray_dynamic_port_end_input$none" - echo "----------------------------------------------------------------" - echo - break - fi - ;; - *) - error - ;; - esac - - done - -} -change_v2ray_id() { - echo - while :; do - echo -e "是否确定要修改用户ID [${magenta}Y/N$none]" - read -p "$(echo -e "默认 [${cyan}N$none]:")" y_n - if [[ -z $y_n ]]; then - echo - echo -e "$green 已取消修改用户ID...$none" - echo - break - else - if [[ $y_n == [Yy] ]]; then - echo - echo - echo -e "$yellow 修改用户ID = $cyan确定$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config uuid - v2ray_id=$uuid - config - clear - view_v2ray_config_info - break - elif [[ $y_n == [Nn] ]]; then - echo - echo -e "$green 已取消修改用户ID...$none" - echo - break - else - error - fi - fi - done -} -change_domain() { - if [[ $v2ray_transport == [45] ]] && [[ $caddy ]]; then - while :; do - echo - echo -e "请输入一个 $magenta正确的域名$none,一定一定一定要正确,不!能!出!错!" - read -p "$(echo -e "(当前域名: ${cyan}$domain$none):") " new_domain - [ -z "$new_domain" ] && error && continue - if [[ $new_domain == $domain ]]; then - echo - echo -e " 跟当前域名一毛一样啊...修改个鸡鸡哦" - echo - error && continue - fi - echo - echo - echo -e "$yellow 你的域名 = $cyan$new_domain$none" - echo "----------------------------------------------------------------" - break - done - get_ip - echo - echo - echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" - echo - echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" - echo - echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" - echo "----------------------------------------------------------------" - echo - - while :; do - - read -p "$(echo -e "(是否已经正确解析: [${magenta}Y$none]):") " record - if [[ -z "$record" ]]; then - error - else - if [[ "$record" == [Yy] ]]; then - domain_check - echo - echo - echo -e "$yellow 域名解析 = ${cyan}我确定已经有解析了$none" - echo "----------------------------------------------------------------" - echo - pause - # domain_check - backup_config domain - domain=$new_domain - caddy_config - config - clear - view_v2ray_config_info - break - else - error - fi - fi - - done - else - echo - echo -e "$red 抱歉...不支持修改...$none" - echo - echo -e " 备注..修改 TLS 域名仅支持传输协议为 ${yellow}WebSocket + TLS$none 或 ${yellow}HTTP/2$none 并且$yellow 自动配置 TLS = 打开$none" - echo - echo -e " 当前传输协议为: ${cyan}${transport[$v2ray_transport - 1]}${none}" - echo - if [[ $caddy ]]; then - echo -e " 自动配置 TLS = ${cyan}打开$none" - else - echo -e " 自动配置 TLS = $red关闭$none" - fi - echo - fi -} -change_path_config() { - if [[ $v2ray_transport == [45] ]] && [[ $caddy && $is_path ]]; then - echo - while :; do - echo -e "请输入想要 ${magenta}用来分流的路径$none , 例如 /233blog , 那么只需要输入 233blog 即可" - read -p "$(echo -e "(当前分流的路径: [${cyan}/${path}$none]):")" new_path - [[ -z $new_path ]] && error && continue - - case $new_path in - $path) - echo - echo -e " 大佬...跟 当前分流的路径 一毛一样啊...修改个鸡鸡哦 " - echo - error - ;; - *[/$]*) - echo - echo -e " 由于这个脚本太辣鸡了..所以分流的路径不能包含$red / $none或$red $ $none这两个符号.... " - echo - error - ;; - *) - echo - echo - echo -e "$yellow 分流的路径 = ${cyan}/${new_path}$none" - echo "----------------------------------------------------------------" - echo - break - ;; - esac - done - pause - backup_config path - path=$new_path - caddy_config - config - clear - view_v2ray_config_info - elif [[ $v2ray_transport == [45] ]] && [[ $caddy ]]; then - path_config_ask - if [[ $new_path ]]; then - backup_config +path - path=$new_path - proxy_site=$new_proxy_site - is_path=true - caddy_config - config - clear - view_v2ray_config_info - else - echo - echo - echo " 给大佬点赞....好果断的放弃配置 网站伪装 和 路径分流" - echo - echo - fi - else - echo - echo -e "$red 抱歉...不支持修改...$none" - echo - echo -e " 备注..修改 分流的路径 仅支持传输协议为 ${yellow}WebSocket + TLS$none 或 ${yellow}HTTP/2$none 并且$yellow 自动配置 TLS = 打开$none" - echo - echo -e " 当前传输协议为: ${cyan}${transport[$v2ray_transport - 1]}${none}" - echo - if [[ $caddy ]]; then - echo -e " 自动配置 TLS = ${cyan}打开$none" - else - echo -e " 自动配置 TLS = $red关闭$none" - fi - echo - change_v2ray_transport_ask - fi - -} -change_proxy_site_config() { - if [[ $v2ray_transport == [45] ]] && [[ $caddy && $is_path ]]; then - echo - while :; do - echo -e "请输入 ${magenta}一个正确的$none ${cyan}网址$none 用来作为 ${cyan}网站的伪装$none , 例如 https://liyafly.com" - echo -e "举例...你当前的域名是$green $domain $none, 伪装的网址的是 https://liyafly.com" - echo -e "然后打开你的域名时候...显示出来的内容就是来自 https://liyafly.com 的内容" - echo -e "其实就是一个反代...明白就好..." - echo -e "如果不能伪装成功...可以使用 v2ray config 修改伪装的网址" - read -p "$(echo -e "(当前伪装的网址: [${cyan}${proxy_site}$none]):")" new_proxy_site - [[ -z $new_proxy_site ]] && error && continue - - case $new_proxy_site in - *[#$]*) - echo - echo -e " 由于这个脚本太辣鸡了..所以伪装的网址不能包含$red # $none或$red $ $none这两个符号.... " - echo - error - ;; - *) - echo - echo - echo -e "$yellow 伪装的网址 = ${cyan}${new_proxy_site}$none" - echo "----------------------------------------------------------------" - echo - break - ;; - esac - done - pause - backup_config proxy_site - proxy_site=$new_proxy_site - caddy_config - echo - echo - echo " 哎哟...好像是修改成功了..." - echo - echo -e " 赶紧打开你的域名 ${cyan}https://${domain}$none 检查一下看看" - echo - echo - elif [[ $v2ray_transport == [45] ]] && [[ $caddy ]]; then - path_config_ask - if [[ $new_path ]]; then - backup_config +path - path=$new_path - proxy_site=$new_proxy_site - is_path=true - caddy_config - config - clear - view_v2ray_config_info - else - echo - echo - echo " 给大佬点赞....好果断的放弃配置 网站伪装 和 路径分流" - echo - echo - fi - else - echo - echo -e "$red 抱歉...不支持修改...$none" - echo - echo -e " 备注..修改 伪装的网址 仅支持传输协议为 ${yellow}WebSocket + TLS$none 或 ${yellow}HTTP/2$none 并且$yellow 自动配置 TLS = 打开$none" - echo - echo -e " 当前传输协议为: ${cyan}${transport[$v2ray_transport - 1]}${none}" - echo - if [[ $caddy ]]; then - echo -e " 自动配置 TLS = ${cyan}打开$none" - else - echo -e " 自动配置 TLS = $red关闭$none" - fi - echo - change_v2ray_transport_ask - fi - -} -domain_check() { - # test_domain=$(dig $new_domain +short) - test_domain=$(ping $new_domain -c 1 | grep -oE -m1 "([0-9]{1,3}\.){3}[0-9]{1,3}") - if [[ $test_domain != $ip ]]; then - echo - echo -e "$red 检测域名解析错误....$none" - echo - echo -e " 你的域名: $yellow$new_domain$none 未解析到: $cyan$ip$none" - echo - echo -e " 你的域名当前解析到: $cyan$test_domain$none" - echo - echo "备注...如果你的域名是使用 Cloudflare 解析的话..在 Status 那里点一下那图标..让它变灰" - echo - exit 1 - fi -} -disable_path() { - if [[ $v2ray_transport == [45] ]] && [[ $caddy && $is_path ]]; then - echo - - while :; do - echo -e "是否关闭 ${yellow}网站伪装 和 路径分流${none} [${magenta}Y/N$none]" - read -p "$(echo -e "(默认 [${cyan}N$none]):") " y_n - [[ -z "$y_n" ]] && y_n="n" - if [[ "$y_n" == [Yy] ]]; then - echo - echo - echo -e "$yellow 关闭 网站伪装 和 路径分流 = $cyan是$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config -path - is_path='' - caddy_config - config - clear - view_v2ray_config_info - break - elif [[ "$y_n" == [Nn] ]]; then - echo - echo -e " $green已取消关闭 网站伪装 和 路径分流 ....$none" - echo - break - else - error - fi - - done - else - echo - echo -e "$red 抱歉...不支持修改...$none" - echo - echo -e " 当前传输协议为: ${cyan}${transport[$v2ray_transport - 1]}${none}" - echo - if [[ $caddy ]]; then - echo -e " 自动配置 TLS = ${cyan}打开$none" - else - echo -e " 自动配置 TLS = $red关闭$none" - fi - echo - if [[ $is_path ]]; then - echo -e " 路径分流 = ${cyan}打开$none" - else - echo -e " 路径分流 = $red关闭$none" - fi - echo - echo -e " 必须为 WebSocket + TLS 或 HTTP/2 传输协议, 自动配置 TLS = ${cyan}打开$none, 路径分流 = ${cyan}打开$none, 才能修改" - echo - - fi -} -blocked_hosts() { - if [[ $ban_ad ]]; then - local _info="$green已开启$none" - else - local _info="$red已关闭$none" - fi - _opt='' - while :; do - echo - echo -e "$yellow 1. $none开启 广告拦截" - echo - echo -e "$yellow 2. $none关闭 广告拦截" - echo - echo "备注: 广告拦截是基于 域名 拦截的..所以也许会造成浏览网页的时候出现部分元素留白..或者其他问题" - echo - echo "反馈问题或请求拦截更多域名: https://github.com/233boy/v2ray/issues" - echo - echo -e "当前广告拦截状态: $_info" - echo - read -p "$(echo -e "请选择 [${magenta}1-2$none]:")" _opt - if [[ -z $_opt ]]; then - error - else - case $_opt in - 1) - if [[ $ban_ad ]]; then - echo - echo -e " 大胸弟...难不成你没有看到 (当前广告拦截状态: $_info) 这个帅帅的提示么.....还开启个鸡鸡哦" - echo - else - echo - echo - echo -e "$yellow 广告拦截 = $cyan开启$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config +ad - ban_ad=true - config - echo - echo - echo -e "$green 广告拦截已开启...如果出现异常..那就关闭它咯$none" - echo - fi - break - ;; - 2) - if [[ $ban_ad ]]; then - echo - echo - echo -e "$yellow 广告拦截 = $cyan关闭$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config -ad - ban_ad='' - config - echo - echo - echo -e "$red 广告拦截已关闭...不过你也可以随时重新开启 ...只要你喜欢$none" - echo - else - echo - echo -e " 大胸弟...难不成你没有看到 (当前广告拦截状态: $_info) 这个帅帅的提示么.....还关闭个鸡鸡哦" - echo - fi - break - ;; - *) - error - ;; - esac - fi - done - -} -change_v2ray_alterId() { - echo - while :; do - echo -e "请输入 ${yellow}alterId${none} 的数值 [${magenta}0-65535$none]" - read -p "$(echo -e "(当前数值是: ${cyan}$alterId$none):") " new_alterId - [[ -z $new_alterId ]] && error && continue - case $new_alterId in - $alterId) - echo - echo -e " 大佬...跟 当前 alterId 一毛一样啊...修改个鸡鸡哦 " - echo - error - ;; - [0-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) - echo - echo - echo -e "$yellow alterId = $cyan$new_alterId$none" - echo "----------------------------------------------------------------" - echo - pause - backup_config alterId - alterId=$new_alterId - config - clear - view_v2ray_config_info - break - ;; - *) - error - ;; - esac - done -} - -custom_uuid() { - echo - while :; do - echo -e "请输入$yello自定义的 UUID$none...(${cyan}UUID 格式一定要对!!!$none)" - read -p "$(echo -e "(当前 UUID: ${cyan}${v2ray_id}$none)"): " myuuid - [ -z "$myuuid" ] && error && continue - case $myuuid in - $v2ray_id) - echo - echo -e " 大佬...跟 当前 UUID 一毛一样啊...修改个鸡鸡哦 " - echo - error - ;; - *[/$]* | *\&*) - echo - echo -e " 由于这个脚本太辣鸡了..所以 UUID 不能包含$red / $none或$red $ $none或$red & $none这三个符号.... " - echo - error - ;; - *) - echo - echo - echo -e "$yellow UUID = $cyan$myuuid$none" - echo - echo -e " 如果 UUID 格式不正确.. V2Ray 会跪...使用$cyan v2ray reuuid$none 复活" - echo "----------------------------------------------------------------" - echo - pause - uuid=$myuuid - backup_config uuid - v2ray_id=$uuid - config - clear - view_v2ray_config_info - break - ;; - esac - done -} -v2ray_service() { - while :; do - echo - echo -e "$yellow 1. $none启动 V2Ray" - echo - echo -e "$yellow 2. $none停止 V2Ray" - echo - echo -e "$yellow 3. $none重启 V2Ray" - echo - echo -e "$yellow 4. $none查看访问日志" - echo - echo -e "$yellow 5. $none查看错误日志" - echo - read -p "$(echo -e "请选择 [${magenta}1-5$none]:")" _opt - if [[ -z $_opt ]]; then - error - else - case $_opt in - 1) - start_v2ray - break - ;; - 2) - stop_v2ray - break - ;; - 3) - restart_v2ray - break - ;; - 4) - view_v2ray_log - break - ;; - 5) - view_v2ray_error_log - break - ;; - *) - error - ;; - esac - fi - done -} -start_v2ray() { - if [[ $v2ray_pid ]]; then - echo - echo -e "${green} V2Ray 正在运行...无需再启动$none" - echo - else - - # systemctl start v2ray - service v2ray start >/dev/null 2>&1 - if [[ $? -ne 0 ]]; then - echo - echo -e "${red} V2Ray 启动失败!$none" - echo - else - echo - echo -e "${green} V2Ray 已启动$none" - echo - fi - - fi -} -stop_v2ray() { - if [[ $v2ray_pid ]]; then - # systemctl stop v2ray - service v2ray stop >/dev/null 2>&1 - echo - echo -e "${green} V2Ray 已停止$none" - echo - else - echo - echo -e "${red} V2Ray 没有在运行$none" - echo - fi -} -restart_v2ray() { - # systemctl restart v2ray - service v2ray restart >/dev/null 2>&1 - if [[ $? -ne 0 ]]; then - echo - echo -e "${red} V2Ray 重启失败!$none" - echo - else - echo - echo -e "${green} V2Ray 重启完成 $none" - echo - fi -} -view_v2ray_log() { - echo - echo -e "$green 按 Ctrl + C 即可退出...$none" - echo - tail -f /var/log/v2ray/access.log -} -view_v2ray_error_log() { - echo - echo -e "$green 按 Ctrl + C 即可退出...$none" - echo - tail -f /var/log/v2ray/error.log -} -download_v2ray_config() { - while :; do - echo - echo -e "$yellow 1. $none直接下载 V2Ray 客户端配置文件(仅支持 Xshell)" - echo - echo -e "$yellow 2. $none生成 V2Ray 客户端配置文件下载链接" - echo - echo -e "$yellow 3. $none生成 V2Ray 配置信息链接" - echo - echo -e "$yellow 4. $none生成 V2Ray 配置二维码链接" - echo - read -p "$(echo -e "请选择 [${magenta}1-4$none]:")" other_opt - if [[ -z $other_opt ]]; then - error - else - case $other_opt in - 1) - get_v2ray_config - break - ;; - 2) - get_v2ray_config_link - break - ;; - 3) - get_v2ray_config_info_link - break - ;; - 4) - get_v2ray_config_qr_link - break - ;; - *) - error - ;; - esac - fi - done -} -get_v2ray_config() { - config - echo - echo " 如果你当前使用的 SSH 客户端不是 Xshell 的话...下载 V2Ray 客户端配置文件将会出现卡死情况" - echo - while :; do - read -p "$(echo -e "不要BB...哥就是在使用 Xshell [${magenta}Y$none]:")" is_xshell - if [[ -z $is_xshell ]]; then - error - else - if [[ $is_xshell == [yY] ]]; then - echo - echo "开始下载....请选择 V2Ray 客户端配置文件保存位置" - echo - # sz /etc/v2ray/233blog_v2ray.zip - local tmpfile="/tmp/233blog_v2ray_config_$RANDOM.json" - cp -f $v2ray_client_config $tmpfile - sz $tmpfile - echo - echo - echo -e "$green 下载完成咯...$none" - echo - # echo -e "$yellow 解压密码 = ${cyan}233blog.com$none" - # echo - echo -e "$yellow SOCKS 监听端口 = ${cyan}2333${none}" - echo - echo -e "${yellow} HTTP 监听端口 = ${cyan}6666$none" - echo - echo "V2Ray 客户端使用教程: https://${_site}/post/4/" - echo - break - else - error - fi - fi - done - [[ -f $tmpfile ]] && rm -rf $tmpfile - -} -get_v2ray_config_link() { - echo - echo -e "$green 正在生成链接.... 稍等片刻即可....$none" - echo - local random=$(echo $RANDOM-$RANDOM-$RANDOM | base64 -w 0) - local link=$(curl -s --upload-file $v2ray_client_config "https://transfer.sh/${random}_v2ray6_v2ray.json") - if [[ $link ]]; then - echo - echo "---------- V2Ray 客户端配置文件链接 -------------" - echo - echo -e "$yellow 链接 = $cyan$link$none" - echo - echo -e "$yellow SOCKS 监听端口 = ${cyan}2333${none}" - echo - echo -e "${yellow} HTTP 监听端口 = ${cyan}6666$none" - echo - echo " V2Ray 客户端使用教程: https://${_site}/post/4/" - echo - echo "备注...链接将在 14 天后失效" - echo - echo "提醒...请不要把链接分享出去...除非你有特别的理由...." - echo - else - echo - echo -e "$red 哎呀呀呀...出错咯...请重试$none" - echo - fi -} -create_v2ray_config_text() { - - get_transport_args - - echo - echo - echo "---------- V2Ray 配置信息 -------------" - if [[ $v2ray_transport == [45] ]]; then - if [[ ! $caddy ]]; then - echo - echo " 警告!请自行配置 TLS...教程: https://${_site}/post/3/" - fi - echo - echo "地址 (Address) = ${domain}" - echo - echo "端口 (Port) = 443" - echo - echo "用户ID (User ID / UUID) = ${v2ray_id}" - echo - echo "额外ID (Alter Id) = ${alterId}" - echo - echo "传输协议 (Network) = ${net}" - echo - echo "伪装类型 (header type) = ${header}" - echo - echo "伪装域名 (host) = ${domain}" - echo - echo "路径 (path) = ${_path}" - echo - echo "TLS (Enable TLS) = 打开" - echo - if [[ $ban_ad ]]; then - echo " 备注: 广告拦截已开启.." - echo - fi - else - [[ -z $ip ]] && get_ip - echo - echo "地址 (Address) = ${ip}" - echo - echo "端口 (Port) = $v2ray_port" - echo - echo "用户ID (User ID / UUID) = ${v2ray_id}" - echo - echo "额外ID (Alter Id) = ${alterId}" - echo - echo "传输协议 (Network) = ${net}" - echo - echo "伪装类型 (header type) = ${header}" - echo - fi - if [[ $v2ray_transport -ge 18 ]] && [[ $ban_ad ]]; then - echo "备注: 动态端口已启用...广告拦截已开启..." - echo - elif [[ $v2ray_transport -ge 18 ]]; then - echo "备注: 动态端口已启用..." - echo - elif [[ $ban_ad ]]; then - echo "备注: 广告拦截已开启.." - echo - fi - echo "---------- END -------------" - echo - echo "V2Ray 客户端使用教程: https://${_site}/post/4/" - echo -} -get_v2ray_config_info_link() { - echo - echo -e "$green 正在生成链接.... 稍等片刻即可....$none" - echo - create_v2ray_config_text >/tmp/233blog_v2ray.txt - local random=$(echo $RANDOM-$RANDOM-$RANDOM | base64 -w 0) - local link=$(curl -s --upload-file /tmp/233blog_v2ray.txt "https://transfer.sh/${random}_v2ray6_v2ray.txt") - if [[ $link ]]; then - echo - echo "---------- V2Ray 配置信息链接-------------" - echo - echo -e "$yellow 链接 = $cyan$link$none" - echo - echo -e " V2Ray 客户端使用教程: https://${_site}/post/4/" - echo - echo "备注...链接将在 14 天后失效..." - echo - echo "提醒...请不要把链接分享出去...除非你有特别的理由...." - echo - else - echo - echo -e "$red 哎呀呀呀...出错咯...请重试$none" - echo - fi - rm -rf /tmp/233blog_v2ray.txt -} -get_v2ray_config_qr_link() { - - create_vmess_URL_config - - _load qr.sh - _qr_create -} - -get_v2ray_multi_vmess_URL_QR() { - echo "---------- V2Ray vmess URL / V2RayNG v0.4.1+ / V2RayN v2.1+ / 仅适合部分客户端 -------------" - get_ip - _load jqcmd.sh - jq_gen_json - jq_printvmess $ip "[233]" - [[ $v6ip ]] && jq_printvmess $v6ip "[233]" - - return -} - -get_v2ray_vmess_URL_link() { - - echo "---------- V2Ray vmess URL / V2RayNG v0.4.1+ / V2RayN v2.1+ / 仅适合部分客户端 -------------" - get_ip - _load jqcmd.sh - jq_gen_json - jq_printvmess $ip "[233]" - [[ $v6ip ]] && jq_printvmess $v6ip "[233]" - - return - - create_vmess_URL_config - local vmess="vmess://$(cat /etc/v2ray/vmess_qr.json | base64 -w 0)" - echo - echo "---------- V2Ray vmess URL / V2RayNG v0.4.1+ / V2RayN v2.1+ / 仅适合部分客户端 -------------" - echo - echo -e ${cyan}$vmess${none} - echo - if [[ -f /etc/v2ray/vmess_qrv6.json ]]; then - local vmessv6="vmess://$(cat /etc/v2ray/vmess_qrv6.json | base64 -w 0)" - echo "IPv6:地址直链:" - echo -e ${cyan}$vmessv6${none} - fi - rm -f /etc/v2ray/vmess_qr.json /etc/v2ray/vmess_qrv6.json -} -other() { - while :; do - echo - echo -e "$yellow 1. $none安装 BBR" - echo - echo -e "$yellow 2. $none安装 LotServer(锐速)" - echo - echo -e "$yellow 3. $none卸载 LotServer(锐速)" - echo - read -p "$(echo -e "请选择 [${magenta}1-3$none]:")" _opt - if [[ -z $_opt ]]; then - error - else - case $_opt in - 1) - install_bbr - break - ;; - 2) - install_lotserver - break - ;; - 3) - uninstall_lotserver - break - ;; - *) - error - ;; - esac - fi - done -} -install_bbr() { - local test1=$(sed -n '/net.ipv4.tcp_congestion_control/p' /etc/sysctl.conf) - local test2=$(sed -n '/net.core.default_qdisc/p' /etc/sysctl.conf) - if [[ $(uname -r | cut -b 1) -eq 4 ]]; then - case $(uname -r | cut -b 3-4) in - 9. | [1-9][0-9]) - if [[ $test1 == "net.ipv4.tcp_congestion_control = bbr" && $test2 == "net.core.default_qdisc = fq" ]]; then - local is_bbr=true - else - local try_enable_bbr=true - fi - ;; - esac - fi - if [[ $is_bbr ]]; then - echo - echo -e "$green BBR 已经启用啦...无需再安装$none" - echo - elif [[ $try_enable_bbr ]]; then - _load bbr.sh - _open_bbr - echo - echo -e "$green ..由于你的 VPS 内核支持开启 BBR ...已经为你启用 BBR 优化....$none" - echo - else - # https://teddysun.com/489.html - bash <(curl -s -L https://github.com/teddysun/across/raw/master/bbr.sh) - fi -} -install_lotserver() { - # https://moeclub.org/2017/03/08/14/ - wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" - bash /tmp/appex.sh 'install' - rm -rf /tmp/appex.sh -} -uninstall_lotserver() { - # https://moeclub.org/2017/03/08/14/ - wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" - bash /tmp/appex.sh 'uninstall' - rm -rf /tmp/appex.sh -} - -open_port() { - _load iptables.sh - _iptables_add $1 -} -del_port() { - _load iptables.sh - _iptables_del $1 -} -update() { - while :; do - echo - echo -e "$yellow 1. $none更新 V2Ray 主程序" - echo - echo -e "$yellow 2. $none更新 V2Ray 管理脚本" - echo - read -p "$(echo -e "请选择 [${magenta}1-2$none]:")" _opt - if [[ -z $_opt ]]; then - error - else - case $_opt in - 1) - update_v2ray - break - ;; - 2) - update_v2ray.sh - exit - break - ;; - *) - error - ;; - esac - fi - done -} -update_v2ray() { - _load download-v2ray.sh - _update_v2ray_version - - if [[ $ssray ]]; then - _load download-ssray.sh - _update_ssray_version - ssray_save_config - fi -} -update_v2ray.sh() { - if [[ $_test ]]; then - local latest_version=$(curl -H 'Cache-Control: no-cache' -s -L "https://raw.githubusercontent.com/233boy/v2ray/test/v2ray.sh" | grep '_version' -m1 | cut -d\" -f2) - else - local latest_version=$(curl -H 'Cache-Control: no-cache' -s -L "https://raw.githubusercontent.com/233boy/v2ray/master/v2ray.sh" | grep '_version' -m1 | cut -d\" -f2) - fi - - if [[ ! $latest_version ]]; then - echo - echo -e " $red获取 V2Ray 最新版本失败!!!$none" - echo - echo -e " 请尝试执行如下命令: $green echo 'nameserver 8.8.8.8' >/etc/resolv.conf $none" - echo - echo " 然后再继续...." - echo - exit 1 - fi - - if [[ $latest_version == $_version ]]; then - echo - echo -e "$green 木有发现新版本 $none" - echo - else - echo - echo -e " $green 咦...发现新版本耶....正在拼命更新.......$none" - echo - cd /etc/v2ray/233boy/v2ray - git pull - cp -f /etc/v2ray/233boy/v2ray/v2ray.sh $_v2ray_sh - chmod +x $_v2ray_sh - echo - echo -e "$green 更新成功啦...当前 V2Ray 管理脚本 版本: ${cyan}$latest_version$none" - echo - fi - -} -uninstall_v2ray() { - _load uninstall.sh -} -config() { - _load config.sh - - if [[ $v2ray_port == "80" ]]; then - if [[ $cmd == "yum" ]]; then - [[ $(pgrep "httpd") ]] && systemctl stop httpd >/dev/null 2>&1 - [[ $(command -v httpd) ]] && yum remove httpd -y >/dev/null 2>&1 - else - [[ $(pgrep "apache2") ]] && service apache2 stop >/dev/null 2>&1 - [[ $(command -v apache2) ]] && apt-get remove apache2* -y >/dev/null 2>&1 - fi - fi - do_service restart v2ray -} -backup_config() { - _load backup.sh - _backup "$@" - -} - -do_service() { - if [[ $systemd ]]; then - systemctl $1 $2 - else - service $2 $1 - fi -} -_help() { - echo - echo "........... V2Ray 管理脚本帮助信息 by ${_site} .........." - echo -e " - ${green}v2ray menu $none管理 V2Ray (同等于直接输入 v2ray) - - ${green}v2ray info $none查看 V2Ray 配置信息 - - ${green}v2ray config $none修改 V2Ray 配置 - - ${green}v2ray link $none生成 V2Ray 客户端配置文件链接 - - ${green}v2ray textlink $none生成 V2Ray 配置信息链接 - - ${green}v2ray qr $none生成 V2Ray 配置二维码链接 - - ${green}v2ray ss $none修改 Shadowsocks 配置 - - ${green}v2ray ssinfo $none查看 Shadowsocks 配置信息 - - ${green}v2ray ssqr $none生成 Shadowsocks 配置二维码链接 - - ${green}v2ray status $none查看 V2Ray 运行状态 - - ${green}v2ray start $none启动 V2Ray - - ${green}v2ray stop $none停止 V2Ray - - ${green}v2ray restart $none重启 V2Ray - - ${green}v2ray log $none查看 V2Ray 运行日志 - - ${green}v2ray update $none更新 V2Ray - - ${green}v2ray traffic $none查看 V2Ray 流量 - - ${green}v2ray update.sh $none更新 V2Ray 管理脚本 - - ${green}v2ray uninstall $none卸载 V2Ray -" -} -menu() { - local _lists=( - "查看 V2Ray 配置" - "修改 V2Ray 配置" - "下载 V2Ray 配置 / 生成配置信息链接 / 生成二维码链接" - "查看 Shadowsocks 配置 / 生成二维码链接" - "修改 Shadowsocks 配置" - "查看 MTProto 配置 / 修改 MTProto 配置" - "查看 Socks5 配置 / 修改 Socks5 配置" - "启动 / 停止 / 重启 / 查看日志" - "更新 V2Ray / 更新 V2Ray 管理脚本" - "卸载 V2Ray" - "其他" - "查看 V2ray 流量统计" - ) - clear - while :; do - echo - echo "........... V2Ray 管理脚本 $_version by ${_site} .........." - echo - echo -e "## V2Ray 版本: $cyan$v2ray_ver$none / V2Ray 状态: $v2ray_status ##" - echo - echo "帮助说明: https://${_site}/post/1/" - echo - echo "反馈问题: https://github.com/233boy/v2ray/issues" - echo - echo "TG 群组: https://t.me/blog233" - echo - echo "捐赠脚本作者: https://${_site}/donate/" - echo - echo "捐助 V2Ray: https://www.v2ray.com/chapter_00/02_donate.html" - for ((i = 1; i <= ${#_lists[*]}; i++)); do - if [[ "$i" -le 9 ]]; then - echo - echo -e "$yellow $i. $none${_lists[$i - 1]}" - else - echo - echo -e "$yellow $i. $none${_lists[$i - 1]}" - fi - done - echo - echo -e "温馨提示...如果你不想执行选项...按$yellow Ctrl + C $none即可退出" - echo - read -p "$(echo -e "请选择菜单 [${magenta}1-${#_lists[*]}$none]:")" choose - if [[ -z $choose ]]; then - exit 1 - else - case $choose in - 1) - view_v2ray_config_info - _yellow " ---- 翻查多用户的vmess link请用v2ray murl查看。" - break - ;; - 2) - change_v2ray_config - break - ;; - 3) - download_v2ray_config - break - ;; - 4) - get_shadowsocks_config - break - ;; - 5) - change_shadowsocks_config - break - ;; - 6) - _load mtproto.sh - _mtproto_main - break - ;; - 7) - _load socks.sh - _socks_main - break - ;; - 8) - v2ray_service - break - ;; - 9) - update - break - ;; - 10) - uninstall_v2ray - break - ;; - 11) - other - break - ;; - 12) - view_v2ray_traffic - break - ;; - *) - error - ;; - esac - fi - done -} -args=$1 -[ -z $1 ] && args="menu" -case $args in -menu) - menu - ;; -i | info) - view_v2ray_config_info - _yellow " ---- 翻查多用户的vmess link请用v2ray murl查看。" - echo - ;; -c | config) - change_v2ray_config - ;; -l | link) - get_v2ray_config_link - ;; -L | infolink) - get_v2ray_config_info_link - ;; -q | qr) - get_v2ray_config_qr_link - ;; -s | ss) - change_shadowsocks_config - ;; -S | ssinfo) - view_shadowsocks_config_info - ;; -Q | ssqr) - get_shadowsocks_config_qr_link - ;; -socks) - _load socks.sh - _socks_main - ;; -socksinfo) - _load socks.sh - _view_socks_info - ;; -tg) - _load mtproto.sh - _mtproto_main - ;; -tginfo) - _load mtproto.sh - _view_mtproto_info - ;; -bt) - _load bt.sh - _ban_bt_main - ;; -status) - echo - if [[ $v2ray_transport == [45] && $caddy ]]; then - echo -e " V2Ray 状态: $v2ray_status / Caddy 状态: $caddy_run_status" - else - echo -e " V2Ray 状态: $v2ray_status" - fi - echo - ;; -start) - start_v2ray - ;; -stop) - stop_v2ray - ;; -restart) - [[ $v2ray_transport == [45] && $caddy ]] && do_service restart caddy - restart_v2ray - ;; -reload) - config - [[ $v2ray_transport == [45] && $caddy ]] && caddy_config - clear - view_v2ray_config_info - ;; -time) - date -s "$(curl -sI g.cn | grep Date | cut -d' ' -f3-6)Z" - ;; -log) - view_v2ray_log - ;; -url | URL) - get_v2ray_vmess_URL_link - ;; -murl | MURL | mqr | MQR) - get_v2ray_multi_vmess_URL_QR - ;; -u | update) - update_v2ray - ;; -U | update.sh) - update_v2ray.sh - exit - ;; -un | uninstall) - uninstall_v2ray - ;; -reinstall) - uninstall_v2ray - if [[ $is_uninstall_v2ray ]]; then - cd - cd - >/dev/null 2>&1 - bash <(curl -s -L https://git.io/v2ray.sh) - fi - ;; -[aA][Ii] | [Dd]) - change_v2ray_alterId - ;; -[aA][Ii][aA][Ii] | [Dd][Dd]) - custom_uuid - ;; -reuuid) - backup_config uuid - v2ray_id=$uuid - config - clear - view_v2ray_config_info - ;; -v | version) - echo - echo -e " 当前 V2Ray 版本: ${green}$v2ray_ver$none / 当前 V2Ray 管理脚本版本: ${cyan}$_version$none" - echo - ;; -bbr) - other - ;; -traffic) - view_v2ray_traffic - ;; -help | *) - _help - ;; -esac +#!/bin/bash + +red='\e[91m' +green='\e[92m' +yellow='\e[93m' +magenta='\e[95m' +cyan='\e[96m' +none='\e[0m' + +# Root +[[ $(id -u) != 0 ]] && echo -e " 哎呀……请使用 ${red}root ${none}用户运行 ${yellow}~(^_^) ${none}" && exit 1 + +_version="v3.08" + +cmd="apt-get" + +sys_bit=$(uname -m) + +if [[ $sys_bit == "i386" || $sys_bit == "i686" ]]; then + v2ray_bit="32" + v2arch="386" +elif [[ $sys_bit == "x86_64" ]]; then + v2ray_bit="64" + v2arch="amd64" +else + echo -e " 哈哈……这个 ${red}辣鸡脚本${none} 不支持你的系统。 ${yellow}(-_-) ${none}" && exit 1 +fi + +if [[ -f /usr/bin/yum ]]; then + + cmd="yum" + +fi + +backup="/etc/v2ray/233blog_v2ray_backup.conf" +ssraybackup="/etc/v2ray/233blog_ssray_backup.conf" + +if [[ -f /usr/bin/v2ray/v2ray && -f /etc/v2ray/config.json ]] && [[ -f $backup && -d /etc/v2ray/233boy/v2ray ]]; then + + . $backup + +elif [[ -f /usr/bin/v2ray/v2ray && -f /etc/v2ray/config.json ]] && [[ -f /etc/v2ray/233blog_v2ray_backup.txt && -d /etc/v2ray/233boy/v2ray ]]; then + + . /etc/v2ray/233boy/v2ray/tools/v1xx_to_v3xx.sh + +else + echo -e " 哎呀哎呀…… ${red}出错咯...请重新安装V2Ray${none} ${yellow}~(^_^) ${none}" && exit 1 +fi + +if [[ $mark != "v3" ]]; then + . /etc/v2ray/233boy/v2ray/tools/v3.sh +fi +if [[ $v2ray_transport -ge 18 ]]; then + dynamicPort=true + port_range="${v2ray_dynamicPort_start}-${v2ray_dynamicPort_end}" +fi +if [[ $path_status ]]; then + is_path=true +fi + +[[ -f $ssraybackup ]] && source $ssraybackup + +uuid=$(cat /proc/sys/kernel/random/uuid) +v2ray_server_config="/etc/v2ray/config.json" +v2ray_client_config="/etc/v2ray/233blog_v2ray_config.json" +v2ray_pid=$(pgrep -f /usr/bin/v2ray/v2ray) +caddy_pid=$(pgrep -f /usr/local/bin/caddy) +_v2ray_sh="/usr/local/sbin/v2ray" +v2ray_ver="$(/usr/bin/v2ray/v2ray -version | head -n 1 | cut -d " " -f2)" +. /etc/v2ray/233boy/v2ray/src/init.sh +systemd=true +# _test=true + +# site +_site="ddog.xyz" + +if [[ $v2ray_ver != v* ]]; then + v2ray_ver="v$v2ray_ver" +fi +if [[ ! -f $_v2ray_sh ]]; then + mv -f /usr/local/bin/v2ray $_v2ray_sh + chmod +x $_v2ray_sh + echo -e "\n $yellow 警告: 请重新登录 SSH 以避免出现 v2ray 命令未找到的情况。$none \n" && exit 1 +fi + +if [ $v2ray_pid ]; then + v2ray_status="$green正在运行$none" +else + v2ray_status="$red未在运行$none" +fi +if [[ $v2ray_transport == [45] && $caddy ]] && [[ $caddy_pid ]]; then + caddy_run_status="$green正在运行$none" +else + caddy_run_status="$red未在运行$none" +fi + +ssray_transports=( + "HTTP (Websocket)" + "HTTPS (Websocket TLS)" + "QUIC (udp)" +) + +_load transport.sh +ciphers=( + aes-128-cfb + aes-256-cfb + chacha20 + chacha20-ietf + aes-128-gcm + aes-256-gcm + chacha20-ietf-poly1305 +) + +get_transport_args() { + _load v2ray-info.sh + _v2_args +} +create_vmess_URL_config() { + + [[ -z $net ]] && get_transport_args + + if [[ $v2ray_transport == [45] ]]; then + cat >/etc/v2ray/vmess_qr.json <<-EOF + { + "v": "2", + "ps": "${_site}_${domain}", + "add": "${domain}", + "port": "443", + "id": "${v2ray_id}", + "aid": "${alterId}", + "net": "${net}", + "type": "none", + "host": "${domain}", + "path": "$_path", + "tls": "tls" + } + EOF + else + [[ -z $ip ]] && get_ip + cat >/etc/v2ray/vmess_qr.json <<-EOF + { + "v": "2", + "ps": "${_site}_${ip}", + "add": "${ip}", + "port": "${v2ray_port}", + "id": "${v2ray_id}", + "aid": "${alterId}", + "net": "${net}", + "type": "${header}", + "host": "${host}", + "path": "", + "tls": "" + } + EOF + if [[ $v6ip ]]; then + cat >/etc/v2ray/vmess_qrv6.json <<-EOF + { + "v": "2", + "ps": "${_site}_${v6ip}", + "add": "${ip}", + "port": "${v2ray_port}", + "id": "${v2ray_id}", + "aid": "${alterId}", + "net": "${net}", + "type": "${header}", + "host": "${host}", + "path": "", + "tls": "" + } + EOF + fi + fi +} +view_v2ray_traffic() { + _load v2ray-traffic.sh + echo + echo + v2_query_all + echo +} +view_v2ray_config_info() { + + _load v2ray-info.sh + _v2_args + _v2_info +} +get_shadowsocks_config() { + if [[ $shadowsocks ]]; then + + while :; do + echo + echo -e "$yellow 1. $none查看 Shadowsocks 配置信息" + echo + echo -e "$yellow 2. $none生成二维码链接" + echo + read -p "$(echo -e "请选择 [${magenta}1-2$none]:")" _opt + if [[ -z $_opt ]]; then + error + else + case $_opt in + 1) + view_shadowsocks_config_info + break + ;; + 2) + get_shadowsocks_config_qr_link + break + ;; + *) + error + ;; + esac + fi + + done + else + shadowsocks_config + fi +} +view_shadowsocks_config_info() { + if [[ $shadowsocks ]]; then + _load ss-info.sh + else + shadowsocks_config + fi +} +get_shadowsocks_config_qr_link() { + if [[ $shadowsocks ]]; then + echo + echo -e "$green 正在生成链接.... 稍等片刻即可....$none" + echo + get_ip + local ss="ss://$(echo -n "${ssciphers}:${sspass}@${ip}:${ssport}" | base64 -w 0)#${_site}_ss_${ip}" + echo "${ss}" >/tmp/233blog_shadowsocks.txt + cat /tmp/233blog_shadowsocks.txt | qrencode -s 50 -o /tmp/233blog_shadowsocks.png + + local random=$(echo $RANDOM-$RANDOM-$RANDOM | base64 -w 0) + local link=$(curl -s --upload-file /tmp/233blog_shadowsocks.png "https://transfer.sh/${random}_v2ray6_shadowsocks.png") + if [[ $link ]]; then + echo + echo "---------- Shadowsocks 二维码链接 -------------" + echo + echo -e "$yellow 链接 = $cyan$link$none" + echo + echo -e " 温馨提示...$red Shadowsocks Win 4.0.6 $none客户端可能无法识别该二维码" + echo + echo "备注...链接将在 14 天后失效" + echo + echo "提醒...请不要把链接分享出去...除非你有特别的理由...." + echo + else + echo + echo -e "$red 哎呀呀呀...出错咯...请重试$none" + echo + fi + rm -rf /tmp/233blog_shadowsocks.png + rm -rf /tmp/233blog_shadowsocks.txt + else + shadowsocks_config + fi + +} + +change_shadowsocks_config() { + if [[ $shadowsocks ]]; then + + while :; do + echo + echo -e "$yellow 1. $none修改 Shadowsocks 端口" + echo + echo -e "$yellow 2. $none修改 Shadowsocks 密码" + echo + echo -e "$yellow 3. $none修改 Shadowsocks 加密协议" + echo + echo -e "$yellow 4. $none修改 Shadowsocks - V2rayPlugin 配置" + echo + echo -e "$yellow 5. $none关闭 Shadowsocks" + echo + read -p "$(echo -e "请选择 [${magenta}1-5$none]:")" _opt + if [[ -z $_opt ]]; then + error + else + case $_opt in + 1) + change_shadowsocks_port + break + ;; + 2) + change_shadowsocks_password + break + ;; + 3) + change_shadowsocks_ciphers + break + ;; + 4) + change_ssray_config + break + ;; + 5) + disable_shadowsocks + break + ;; + *) + error + ;; + esac + fi + + done + else + + shadowsocks_config + fi +} +shadowsocks_config() { + echo + echo + echo -e " $red大佬...你没有配置 Shadowsocks $none...不过现在想要配置的话也是可以的 ^_^" + echo + echo + + while :; do + echo -e "是否配置 ${yellow}Shadowsocks${none} [${magenta}Y/N$none]" + read -p "$(echo -e "(默认 [${cyan}N$none]):") " install_shadowsocks + [[ -z "$install_shadowsocks" ]] && install_shadowsocks="n" + if [[ "$install_shadowsocks" == [Yy] ]]; then + echo + shadowsocks=true + shadowsocks_port_config + shadowsocks_password_config + shadowsocks_ciphers_config + pause + open_port $new_ssport + backup_config +ss + ssport=$new_ssport + sspass=$new_sspass + ssciphers=$new_ssciphers + config + clear + view_shadowsocks_config_info + break + elif [[ "$install_shadowsocks" == [Nn] ]]; then + echo + echo -e " $green已取消配置 Shadowsocks ....$none" + echo + break + else + error + fi + + done +} +shadowsocks_port_config() { + local random=$(shuf -i20001-65535 -n1) + while :; do + echo -e "请输入 "$yellow"Shadowsocks"$none" 端口 ["$magenta"1-65535"$none"],不能和 "$yellow"V2ray"$none" 端口相同" + read -p "$(echo -e "(默认端口: ${cyan}${random}$none):") " new_ssport + [ -z "$new_ssport" ] && new_ssport=$random + case $new_ssport in + $v2ray_port) + echo + echo -e " 不能和$cyan V2Ray 端口 $none一毛一样...." + echo + echo -e " 当前 V2Ray 端口:${cyan}$v2ray_port${none}" + error + ;; + [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) + if [[ $v2ray_transport == [45] ]]; then + local tls=true + fi + if [[ $tls && $new_ssport == "80" ]] || [[ $tls && $new_ssport == "443" ]]; then + echo + echo -e "由于你当前已使用了 "$green"WebSocket + TLS $none或$green HTTP/2"$none" 传输协议." + echo + echo -e "所以不能选择 "$magenta"80"$none" 或 "$magenta"443"$none" 端口" + error + elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start == $new_ssport || $v2ray_dynamicPort_end == $new_ssport ]]; then + echo + echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" + error + elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start -lt $new_ssport && $new_ssport -le $v2ray_dynamicPort_end ]]; then + echo + echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" + error + elif [[ $socks && $new_ssport == $socks_port ]]; then + echo + echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" + error + elif [[ $mtproto && $new_ssport == $mtproto_port ]]; then + echo + echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" + error + else + echo + echo + echo -e "$yellow Shadowsocks 端口 = $cyan$new_ssport$none" + echo "----------------------------------------------------------------" + echo + break + fi + ;; + *) + error + ;; + esac + + done + +} + +shadowsocks_password_config() { + + while :; do + echo -e "请输入 "$yellow"Shadowsocks"$none" 密码" + read -p "$(echo -e "(默认密码: ${cyan}233blog.com$none)"): " new_sspass + [ -z "$new_sspass" ] && new_sspass="233blog.com" + case $new_sspass in + *[/$]*) + echo + echo -e " 由于这个脚本太辣鸡了..所以密码不能包含$red / $none或$red $ $none这两个符号.... " + echo + error + ;; + *) + echo + echo + echo -e "$yellow Shadowsocks 密码 = $cyan$new_sspass$none" + echo "----------------------------------------------------------------" + echo + break + ;; + esac + + done + +} + +shadowsocks_ciphers_config() { + + while :; do + echo -e "请选择 "$yellow"Shadowsocks"$none" 加密协议 [${magenta}1-7$none]" + for ((i = 1; i <= ${#ciphers[*]}; i++)); do + ciphers_show="${ciphers[$i - 1]}" + echo + echo -e "$yellow $i. $none${ciphers_show}" + done + echo + read -p "$(echo -e "(默认加密协议: ${cyan}${ciphers[6]}$none)"):" ssciphers_opt + [ -z "$ssciphers_opt" ] && ssciphers_opt=7 + case $ssciphers_opt in + [1-7]) + new_ssciphers=${ciphers[$ssciphers_opt - 1]} + echo + echo + echo -e "$yellow Shadowsocks 加密协议 = $cyan${new_ssciphers}$none" + echo "----------------------------------------------------------------" + echo + break + ;; + *) + error + ;; + esac + + done +} + +change_shadowsocks_port() { + echo + while :; do + echo -e "请输入 "$yellow"Shadowsocks"$none" 端口 ["$magenta"1-65535"$none"]" + read -p "$(echo -e "(当前端口: ${cyan}$ssport$none):") " new_ssport + [ -z "$new_ssport" ] && error && continue + case $new_ssport in + $ssport) + echo + echo " 跟当前端口一毛一样....修改个鸡鸡哦" + error + ;; + $v2ray_port) + echo + echo -e " 不能和$cyan V2Ray 端口 $none一毛一样...." + error + ;; + [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) + if [[ $v2ray_transport == [45] ]]; then + local tls=true + fi + if [[ $tls && $new_ssport == "80" ]] || [[ $tls && $new_ssport == "443" ]]; then + echo + echo -e "由于你已选择了 "$green"WebSocket + TLS $none或$green HTTP/2"$none" 传输协议." + echo + echo -e "所以不能选择 "$magenta"80"$none" 或 "$magenta"443"$none" 端口" + error + elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start == $new_ssport || $v2ray_dynamicPort_end == $new_ssport ]]; then + echo + echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" + error + elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start -lt $new_ssport && $new_ssport -le $v2ray_dynamicPort_end ]]; then + echo + echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" + error + elif [[ $socks && $new_ssport == $socks_port ]]; then + echo + echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" + error + elif [[ $mtproto && $new_ssport == $mtproto_port ]]; then + echo + echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" + error + else + echo + echo + echo -e "$yellow Shadowsocks 端口 = $cyan$new_ssport$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config ssport + del_port $ssport + open_port $new_ssport + ssport=$new_ssport + config + clear + view_shadowsocks_config_info + break + fi + ;; + *) + error + ;; + esac + + done +} +change_shadowsocks_password() { + echo + while :; do + echo -e "请输入 "$yellow"Shadowsocks"$none" 密码" + read -p "$(echo -e "(当前密码:${cyan}$sspass$none)"): " new_sspass + [ -z "$new_sspass" ] && error && continue + case $new_sspass in + $sspass) + echo + echo " 跟当前密码一毛一样....修改个鸡鸡哦" + error + ;; + *[/$]*) + echo + echo -e " 由于这个脚本太辣鸡了..所以密码不能包含$red / $none或$red $ $none这两个符号.... " + echo + error + ;; + *) + echo + echo + echo -e "$yellow Shadowsocks 密码 = $cyan$new_sspass$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config sspass + sspass=$new_sspass + config + clear + view_shadowsocks_config_info + break + ;; + esac + + done + +} + +change_shadowsocks_ciphers() { + echo + while :; do + echo -e "请选择 "$yellow"Shadowsocks"$none" 加密协议 [${magenta}1-${#ciphers[*]}$none]" + for ((i = 1; i <= ${#ciphers[*]}; i++)); do + ciphers_show="${ciphers[$i - 1]}" + echo + echo -e "$yellow $i. $none${ciphers_show}" + done + echo + read -p "$(echo -e "(当前加密协议: ${cyan}${ssciphers}$none)"):" ssciphers_opt + [ -z "$ssciphers_opt" ] && error && continue + case $ssciphers_opt in + [1-7]) + new_ssciphers=${ciphers[$ssciphers_opt - 1]} + if [[ $new_ssciphers == $ssciphers ]]; then + echo + echo " 跟当前加密协议一毛一样....修改个鸡鸡哦" + error && continue + fi + echo + echo + echo -e "$yellow Shadowsocks 加密协议 = $cyan${new_ssciphers}$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config ssciphers + ssciphers=$new_ssciphers + config + clear + view_shadowsocks_config_info + break + ;; + *) + error + ;; + esac + + done + +} +disable_shadowsocks() { + echo + + while :; do + echo -e "是否关闭 ${yellow}Shadowsocks${none} [${magenta}Y/N$none]" + read -p "$(echo -e "(默认 [${cyan}N$none]):") " y_n + [[ -z "$y_n" ]] && y_n="n" + if [[ "$y_n" == [Yy] ]]; then + echo + echo + echo -e "$yellow 关闭 Shadowsocks = $cyan是$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config -ss + del_port $ssport + shadowsocks='' + config + # clear + echo + echo + echo + echo -e "$green Shadowsocks 已关闭...不过你也可以随时重新启用 Shadowsocks ...只要你喜欢$none" + echo + break + elif [[ "$y_n" == [Nn] ]]; then + echo + echo -e " $green已取消关闭 Shadowsocks ....$none" + echo + break + else + error + fi + + done +} + +ssray_config() { + echo + echo + echo -e " $red大佬...你没有配置 Shadowsocks - V2ray - Plugin $none...不过现在想要配置的话也是可以的 ^_^" + echo + echo + + while :; do + echo -e "是否配置 ${yellow}Shadowsocks - V2ray Plugin ${none} [${magenta}Y/N$none]" + echo + echo + echo -e "${yellow}注:v2ray-plugin 跟v2ray 是互相独立的程序,眉有关系。${none}" + echo + echo -e "${yellow} v2ray-plugin 跟原版shadowsocks同时服务 ${none}" + echo + echo + read -p "$(echo -e "(默认 [${cyan}N$none]):") " install_ssray + [[ -z "$install_ssray" ]] && install_ssray="n" + if [[ "$install_ssray" == [Yy] ]]; then + echo + ssray=true + ssray_port_config + ssray_proto_config + break + elif [[ "$install_ssray" == [Nn] ]]; then + break + else + error + fi + + done + + _download_ssray_file + ssray_apply_config + ssray_save_config + _load ss-info.sh +} + +ssray_port_config() { + local random=$(shuf -i20001-65535 -n1) + while :; do + echo -e "请输入 "$yellow"Shadowsocks - v2ray-plugin"$none" 端口 ["$magenta"1-65535"$none"],不能和 "$yellow"V2Ray / shadowsocks "$none" 端口相同" + read -p "$(echo -e "(默认端口: ${cyan}${random}$none):") " ssrayport + [ -z "$ssrayport" ] && ssrayport=$random + case $ssrayport in + $ssport) + echo + echo " 不能和 Shadowsocks 端口一毛一样...." + error + ;; + $v2ray_port) + echo + echo " 不能和 V2Ray 端口一毛一样...." + error + ;; + [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) + if [[ $tls && $ssrayport == "80" ]] || [[ $tls && $ssrayport == "443" ]]; then + echo + echo -e "由于你已选择了 "$green"WebSocket + TLS $none或$green HTTP/2"$none" 传输协议." + echo + echo -e "所以不能选择 "$magenta"80"$none" 或 "$magenta"443"$none" 端口" + error + elif [[ $v2ray_dynamic_port_start_input == $ssrayport || $v2ray_dynamic_port_end_input == $ssrayport ]]; then + local multi_port="${v2ray_dynamic_port_start_input} - ${v2ray_dynamic_port_end_input}" + echo + echo " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:$multi_port" + error + elif [[ $v2ray_dynamic_port_start_input -lt $ssrayport && $ssrayport -le $v2ray_dynamic_port_end_input ]]; then + local multi_port="${v2ray_dynamic_port_start_input} - ${v2ray_dynamic_port_end_input}" + echo + echo " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:$multi_port" + error + else + echo + echo + echo -e "$yellow Shadowsocks v2ray-plugin 端口 = $cyan$ssrayport$none" + echo "----------------------------------------------------------------" + echo + break + fi + ;; + *) + error + ;; + esac + + done +} + +ssray_proto_config() { + + echo + while :; do + echo -e "请选择 "$yellow"V2Ray-Plugin"$none" 传输协议 [${magenta}1-${#transport[*]}$none]" + echo + for ((i = 1; i <= ${#ssray_transports[*]}; i++)); do + Stream="${ssray_transports[$i - 1]}" + echo -e "$yellow $i. $none${Stream}" + done + echo + echo -e "$yellow 备注: 2.HTTPS 3.QUIC 均要求严格验证【域名】与【证书】,需要解析至本机的公共域名 $none" + echo + read -p "$(echo -e "(默认协议: ${cyan}http$none)"):" ssray_transport + [ -z "$ssray_transport" ] && ssray_transport=1 + echo -e "$yellow V2Ray-Plugin 传输协议 = $cyan${ssray_transports[$ssray_transport - 1]}$none" + echo + echo + echo "----------------------------------------------------------------" + get_ip + case $ssray_transport in + 1) + ssrayopt="server" + ssray_domain=$ip + break + ;; + [2-3]) + while :; do + echo + echo -e "请输入一个 $magenta正确的域名$none,一定一定一定要正确,不!能!出!错!" + read -p "(例如:233blog.com): " ssray_domain + [ -z "$ssray_domain" ] && error && continue + echo + echo + echo -e "$yellow 你的域名 = $cyan$ssray_domain$none" + echo "----------------------------------------------------------------" + break + done + echo + echo + echo -e "$yellow 请将 $magenta$ssray_domain$none $yellow解析到: $cyan$ip$none" + echo + echo -e "$yellow 请将 $magenta$ssray_domain$none $yellow解析到: $cyan$ip$none" + echo + echo -e "$yellow 请将 $magenta$ssray_domain$none $yellow解析到: $cyan$ip$none" + echo "----------------------------------------------------------------" + echo + case $ssray_transport in + 2) + ssrayopt="server;tls;host=${ssray_domain}" + break + ;; + 3) + ssrayopt="server;mode=quic;host=${ssray_domain}" + break + ;; + esac + break + ;; + *) + error + ;; + esac + done + echo + echo + echo + if [[ $ssray_transport -gt 1 && $ssray_domain ]]; then + if [[ -f /root/.acme.sh/$ssray_domain/fullchain.cer && -f /root/.acme.sh/$ssray_domain/$ssray_domain.key ]]; then + echo -e "$yellow 噫!好像已经有证书了! 皮皮虾咋们走! $none" + else + echo -e "$yellow 开始安装acme.sh $none" + if ! command -v socat; then + echo -e "$red 需要安装socat $none" + exit 1 + fi + curl https://get.acme.sh | bash + + echo -e "$yellow 开始申请 $ssray_domain 的证书,如果有正在使用80端口的程序先让它们退下~... $none" + pkill caddy + pkill httpd + pkill nginx + sleep 3 + + if /root/.acme.sh/acme.sh --issue --standalone -d $ssray_domain ; then + echo -e "$yellow 好了搞定了。$none" + else + echo -e "$yellow 不知道什么鬼,上面的出错提示截图找人问吧!$none" + exit 1 + fi + fi + fi +} + +change_ssray_config() { + + _load download-ssray.sh + + if [[ $ssray ]]; then + + + while :; do + echo + echo -e "$yellow 1. $none修改 Shadowsocks - V2ray插件 端口" + echo + echo -e "$yellow 2. $none修改 Shadowsocks - V2ray插件 协议" + echo + echo -e "$yellow 3. $none升级 Shadowsocks - V2ray插件" + echo + echo -e "$yellow 4. $none关闭 Shadowsocks - V2ray" + echo + read -p "$(echo -e "请选择 [${magenta}1-3$none]:")" _opt + if [[ -z $_opt ]]; then + error + else + case $_opt in + 1) + local oldssrayport=$ssrayport + ssray_port_config + ssray_save_config + ssray_apply_config + del_port $oldssrayport + open_port $ssrayport + _load ss-info.sh + break + ;; + 2) + ssray_proto_config + ssray_save_config + ssray_apply_config + _load ss-info.sh + break + ;; + 3) + _update_ssray_version + ssray_save_config + break + ;; + 4) + del_port $ssrayport + _uninstall_ssray + ssray= + install_ssray=n + rm -f $ssraybackup + break + ;; + *) + error + ;; + esac + fi + + done + + else + ssray_config + fi +} + +ssray_save_config() { + cat > $ssraybackup << EOF +install_ssray=${install_ssray} +ssray_ver="$ssray_latest_ver" +ssray=${ssray} +ssray_transport=${ssray_transport} +ssrayport=${ssrayport} +ssray_domain="${ssray_domain}" +ssrayopt="${ssrayopt}" +EOF +} + +ssray_apply_config() { + _install_ssray_service + open_port $ssrayport + do_service restart ssray +} + +change_v2ray_config() { + local _menu=( + "修改 V2Ray 端口" + "修改 V2Ray 传输协议" + "修改 V2Ray 动态端口 (如果可以)" + "修改 用户ID ( UUID )" + "修改 TLS 域名 (如果可以)" + "修改 分流的路径 (如果可以)" + "修改 伪装的网址 (如果可以)" + "关闭 网站伪装 和 路径分流 (如果可以)" + "开启 / 关闭 广告拦截" + "增加 V2ray 用户" + ) + while :; do + for ((i = 1; i <= ${#_menu[*]}; i++)); do + if [[ "$i" -le 9 ]]; then + echo + echo -e "$yellow $i. $none${_menu[$i - 1]}" + else + echo + echo -e "$yellow $i. $none${_menu[$i - 1]}" + fi + done + echo + read -p "$(echo -e "请选择 [${magenta}1-${#_menu[*]}$none]:")" _opt + if [[ -z $_opt ]]; then + error + else + case $_opt in + 1) + change_v2ray_port + break + ;; + 2) + change_v2ray_transport + break + ;; + 3) + change_v2ray_dynamicport + break + ;; + 4) + change_v2ray_id + break + ;; + 5) + change_domain + break + ;; + 6) + change_path_config + break + ;; + 7) + change_proxy_site_config + break + ;; + 8) + disable_path + break + ;; + 9) + blocked_hosts + break + ;; + 10) + change_vmess_user + break + ;; + [aA][Ii][aA][Ii] | [Dd][Dd]) + custom_uuid + break + ;; + [Dd] | [Aa][Ii] | 233 | 233[Bb][Ll][Oo][Gg] | 233[Bb][Ll][Oo][Gg].[Cc][Oo][Mm] | 233[Bb][Oo][Yy] | [Aa][Ll][Tt][Ee][Rr][Ii][Dd]) + change_v2ray_alterId + break + ;; + *) + error + ;; + esac + fi + done +} + +change_vmess_user () { + echo + echo + + local uuid=$(cat /proc/sys/kernel/random/uuid) + local randomemail=${3:-${uuid:30}@233.com} + while :; do + echo -e "请输入 "$yellow"新用户AlterId$none (0~65535 整数)" + read -p "[默认:64]" new_alterId + [[ -z $new_alterId ]] && new_alterId=64 + if [[ $new_alterId =~ ^[0-9]+$ ]]; then + break; + else + _red "$new_alterId 是啥???" + fi + done + + echo -e "请输入 "$yellow"新用户 Email"$none"(任意字符,仅作统计识别)" + read -p "[默认:${randomemail}]" new_email + [[ -z $new_email ]] && new_email=$randomemail + + echo + echo + _load jqcmd.sh + jq_gen_jsonpatch + jq_vmess_adduser $uuid $new_alterId $new_email + jq_printvmess $ip "[233]" + [[ $v6ip ]] && jq_printvmess $v6ip "[233]" + jq_patchback + jq_clear_tmp + echo + echo + _yellow " ---- 搞定了。" + restart_v2ray + _yellow " ---- 翻查多用户的vmess link请用v2ray murl查看。" + _yellow " ---- 翻查各个用户的流量,可用v2ray traffic查看(重启v2ray后会清空)。" + echo + +} + +change_v2ray_port() { + if [[ $v2ray_transport == 4 ]]; then + echo + echo -e " 由于你目前使用的是$yellow WebSocket + TLS $none传输协议...所以修不修改 V2Ray 端口没有什么不一样的" + echo + echo " 如果你想要使用其他端口...可以先修改 V2Ray 的传输协议..之后再修改 V2Ray 端口" + echo + change_v2ray_transport_ask + elif [[ $v2ray_transport == 5 ]]; then + echo + echo -e " 由于你目前使用的是$yellow HTTP/2 $none传输协议...所以修不修改 V2Ray 端口没有什么不一样的" + echo + echo " 如果你想要使用其他端口...可以先修改 V2Ray 的传输协议..之后再修改 V2Ray 端口" + echo + change_v2ray_transport_ask + else + echo + while :; do + echo -e "请输入 "$yellow"V2Ray"$none" 端口 ["$magenta"1-65535"$none"]" + read -p "$(echo -e "(当前端口: ${cyan}${v2ray_port}$none):")" new_v2ray_port + [[ -z $new_v2ray_port ]] && error && continue + case $new_v2ray_port in + $v2ray_port) + echo + echo " 哎呀...跟当前端口一毛一样呀...修改个鸡鸡哦" + error + ;; + [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) + if [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start == $new_v2ray_port || $v2ray_dynamicPort_end == $new_v2ray_port ]]; then + echo + echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" + error + elif [[ $dynamicPort ]] && [[ $v2ray_dynamicPort_start -lt $new_v2ray_port && $new_v2ray_port -le $v2ray_dynamicPort_end ]]; then + echo + echo -e " 抱歉,此端口和 V2Ray 动态端口 冲突,当前 V2Ray 动态端口范围为:${cyan}$port_range${none}" + error + elif [[ $shadowsocks && $new_v2ray_port == $ssport ]]; then + echo + echo -e "抱歉, 此端口跟 Shadowsocks 端口冲突...当前 Shadowsocks 端口: ${cyan}$ssport$none" + error + elif [[ $socks && $new_v2ray_port == $socks_port ]]; then + echo + echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" + error + elif [[ $mtproto && $new_v2ray_port == $mtproto_port ]]; then + echo + echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" + error + else + echo + echo + echo -e "$yellow V2Ray 端口 = $cyan$new_v2ray_port$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config v2ray_port + del_port $v2ray_port + open_port $new_v2ray_port + v2ray_port=$new_v2ray_port + config + clear + view_v2ray_config_info + break + fi + ;; + *) + error + ;; + esac + + done + fi + +} +change_v2ray_transport_ask() { + echo + while :; do + echo -e "是否需要修改$yellow V2Ray $none传输协议 [${magenta}Y/N$none]" + read -p "$(echo -e "默认 [${cyan}N$none]:")" y_n + [ -z $y_n ] && break + if [[ $y_n == [Yy] ]]; then + change_v2ray_transport + break + elif [[ $y_n == [Nn] ]]; then + break + else + error + fi + done +} +change_v2ray_transport() { + echo + while :; do + echo -e "请选择 "$yellow"V2Ray"$none" 传输协议 [${magenta}1-${#transport[*]}$none]" + echo + for ((i = 1; i <= ${#transport[*]}; i++)); do + Stream="${transport[$i - 1]}" + if [[ "$i" -le 9 ]]; then + # echo + echo -e "$yellow $i. $none${Stream}" + else + # echo + echo -e "$yellow $i. $none${Stream}" + fi + done + echo + echo "备注1: 含有 [dynamicPort] 的即启用动态端口.." + echo "备注2: [utp | srtp | wechat-video | dtls | wireguard] 分别伪装成 [BT下载 | 视频通话 | 微信视频通话 | DTLS 1.2 数据包 | WireGuard 数据包]" + echo + read -p "$(echo -e "(当前传输协议: ${cyan}${transport[$v2ray_transport - 1]}$none)"):" new_v2ray_transport + if [ -z "$new_v2ray_transport" ]; then + error + else + case $new_v2ray_transport in + $v2ray_transport) + echo + echo " 哎呀...跟当前传输协议一毛一样呀...修改个鸡鸡哦" + error + ;; + 4 | 5) + if [[ $v2ray_port == "80" || $v2ray_port == "443" ]]; then + echo + echo -e " 抱歉...如果你想要使用${cyan} ${transport[$new_v2ray_transport - 1]} $none传输协议.. ${red}V2Ray 端口不能为 80 或者 443 ...$none" + echo + echo -e " 当前 V2Ray 端口: ${cyan}$v2ray_port$none" + error + elif [[ $shadowsocks ]] && [[ $ssport == "80" || $ssport == "443" ]]; then + echo + echo -e " 抱歉...如果你想要使用${cyan} ${transport[$new_v2ray_transport - 1]} $none传输协议.. ${red}Shadowsocks 端口不能为 80 或者 443 ...$none" + echo + echo -e " 当前 Shadowsocks 端口: ${cyan}$ssport$none" + error + elif [[ $socks ]] && [[ $socks_port == "80" || $socks_port == "443" ]]; then + echo + echo -e " 抱歉...如果你想要使用${cyan} ${transport[$new_v2ray_transport - 1]} $none传输协议.. ${red}Socks 端口不能为 80 或者 443 ...$none" + echo + echo -e " 当前 Socks 端口: ${cyan}$socks_port$none" + error + elif [[ $mtproto ]] && [[ $mtproto_port == "80" || $mtproto_port == "443" ]]; then + echo + echo -e " 抱歉...如果你想要使用${cyan} ${transport[$new_v2ray_transport - 1]} $none传输协议.. ${red}MTProto 端口不能为 80 或者 443 ...$none" + echo + echo -e " 当前 MTProto 端口: ${cyan}$mtproto_port$none" + error + else + echo + echo + echo -e "$yellow V2Ray 传输协议 = $cyan${transport[$new_v2ray_transport - 1]}$none" + echo "----------------------------------------------------------------" + echo + break + fi + ;; + [1-9] | [1-2][0-9] | 3[0-2]) + echo + echo + echo -e "$yellow V2Ray 传输协议 = $cyan${transport[$new_v2ray_transport - 1]}$none" + echo "----------------------------------------------------------------" + echo + break + ;; + *) + error + ;; + esac + fi + + done + pause + + if [[ $new_v2ray_transport == [45] ]]; then + tls_config + elif [[ $new_v2ray_transport -ge 18 ]]; then + v2ray_dynamic_port_start + v2ray_dynamic_port_end + pause + old_transport + open_port "multiport" + backup_config v2ray_transport v2ray_dynamicPort_start v2ray_dynamicPort_end + port_range="${v2ray_dynamic_port_start_input}-${v2ray_dynamic_port_end_input}" + v2ray_transport=$new_v2ray_transport + config + clear + view_v2ray_config_info + else + old_transport + backup_config v2ray_transport + v2ray_transport=$new_v2ray_transport + config + clear + view_v2ray_config_info + fi + +} +old_transport() { + if [[ $v2ray_transport == [45] ]]; then + del_port "80" + del_port "443" + if [[ $caddy && $caddy_pid ]]; then + do_service stop caddy + if [[ $systemd ]]; then + systemctl disable caddy >/dev/null 2>&1 + else + update-rc.d -f caddy remove >/dev/null 2>&1 + fi + elif [[ $caddy ]]; then + if [[ $systemd ]]; then + systemctl disable caddy >/dev/null 2>&1 + else + update-rc.d -f caddy remove >/dev/null 2>&1 + fi + fi + if [[ $is_path ]]; then + backup_config -path + fi + elif [[ $v2ray_transport -ge 18 ]]; then + del_port "multiport" + fi +} + +tls_config() { + while :; do + echo + echo + echo + echo -e "请输入一个 $magenta正确的域名$none,一定一定一定要正确,不!能!出!错!" + read -p "(例如:233blog.com): " new_domain + [ -z "$new_domain" ] && error && continue + echo + echo + echo -e "$yellow 你的域名 = $cyan$new_domain$none" + echo "----------------------------------------------------------------" + break + done + get_ip + echo + echo + echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" + echo + echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" + echo + echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" + echo "----------------------------------------------------------------" + echo + + while :; do + + read -p "$(echo -e "(是否已经正确解析: [${magenta}Y$none]):") " record + if [[ -z "$record" ]]; then + error + else + if [[ "$record" == [Yy] ]]; then + domain_check + echo + echo + echo -e "$yellow 域名解析 = ${cyan}我确定已经有解析了$none" + echo "----------------------------------------------------------------" + echo + break + else + error + fi + fi + + done + + if [[ $caddy ]]; then + path_config_ask + pause + # domain_check + backup_config v2ray_transport domain + if [[ $new_path ]]; then + backup_config +path + path=$new_path + proxy_site=$new_proxy_site + is_path=true + fi + + if [[ $v2ray_transport -ge 18 ]]; then + del_port "multiport" + fi + domain=$new_domain + + open_port "80" + open_port "443" + if [[ $systemd ]]; then + systemctl enable caddy >/dev/null 2>&1 + else + update-rc.d -f caddy defaults >/dev/null 2>&1 + fi + v2ray_transport=$new_v2ray_transport + caddy_config + config + clear + view_v2ray_config_info + else + if [[ $new_v2ray_transport == 5 ]]; then + path_config_ask + pause + domain_check + backup_config v2ray_transport domain caddy + if [[ $new_path ]]; then + backup_config +path + path=$new_path + proxy_site=$new_proxy_site + is_path=true + fi + if [[ $v2ray_transport -ge 18 ]]; then + del_port "multiport" + fi + domain=$new_domain + install_caddy + open_port "80" + open_port "443" + v2ray_transport=$new_v2ray_transport + caddy_config + config + caddy=true + clear + view_v2ray_config_info + else + auto_tls_config + fi + fi + +} +auto_tls_config() { + echo -e " + + 安装 Caddy 来实现 自动配置 TLS + + 如果你已经安装 Nginx 或 Caddy + + $yellow并且..自己能搞定配置 TLS$none + + 那么就不需要 打开自动配置 TLS + " + echo "----------------------------------------------------------------" + echo + + while :; do + + read -p "$(echo -e "(是否自动配置 TLS: [${magenta}Y/N$none]):") " auto_install_caddy + if [[ -z "$auto_install_caddy" ]]; then + error + else + if [[ "$auto_install_caddy" == [Yy] ]]; then + echo + echo + echo -e "$yellow 自动配置 TLS = $cyan打开$none" + echo "----------------------------------------------------------------" + echo + path_config_ask + pause + domain_check + backup_config v2ray_transport domain caddy + if [[ $new_path ]]; then + backup_config +path + path=$new_path + proxy_site=$new_proxy_site + is_path=true + fi + if [[ $v2ray_transport -ge 18 ]]; then + del_port "multiport" + fi + domain=$new_domain + install_caddy + open_port "80" + open_port "443" + v2ray_transport=$new_v2ray_transport + caddy_config + config + caddy=true + clear + view_v2ray_config_info + break + elif [[ "$auto_install_caddy" == [Nn] ]]; then + echo + echo + echo -e "$yellow 自动配置 TLS = $cyan关闭$none" + echo "----------------------------------------------------------------" + echo + pause + domain_check + backup_config v2ray_transport domain + if [[ $v2ray_transport -ge 18 ]]; then + del_port "multiport" + fi + domain=$new_domain + open_port "80" + open_port "443" + v2ray_transport=$new_v2ray_transport + config + clear + view_v2ray_config_info + break + else + error + fi + fi + + done +} + +path_config_ask() { + echo + while :; do + echo -e "是否开启 网站伪装 和 路径分流 [${magenta}Y/N$none]" + read -p "$(echo -e "(默认: [${cyan}N$none]):")" path_ask + [[ -z $path_ask ]] && path_ask="n" + + case $path_ask in + Y | y) + path_config + break + ;; + N | n) + echo + echo + echo -e "$yellow 网站伪装 和 路径分流 = $cyan不想配置$none" + echo "----------------------------------------------------------------" + echo + break + ;; + *) + error + ;; + esac + done +} +path_config() { + echo + while :; do + echo -e "请输入想要 ${magenta}用来分流的路径$none , 例如 /233blog , 那么只需要输入 233blog 即可" + read -p "$(echo -e "(默认: [${cyan}233blog$none]):")" new_path + [[ -z $new_path ]] && new_path="233blog" + + case $new_path in + *[/$]*) + echo + echo -e " 由于这个脚本太辣鸡了..所以分流的路径不能包含$red / $none或$red $ $none这两个符号.... " + echo + error + ;; + *) + echo + echo + echo -e "$yellow 分流的路径 = ${cyan}/${new_path}$none" + echo "----------------------------------------------------------------" + echo + break + ;; + esac + done + proxy_site_config +} +proxy_site_config() { + echo + while :; do + echo -e "请输入 ${magenta}一个正确的$none ${cyan}网址$none 用来作为 ${cyan}网站的伪装$none , 例如 https://liyafly.com" + echo -e "举例...假设你当前的域名是$green $domain $none, 伪装的网址的是 https://liyafly.com" + echo -e "然后打开你的域名时候...显示出来的内容就是来自 https://liyafly.com 的内容" + echo -e "其实就是一个反代...明白就好..." + echo -e "如果不能伪装成功...可以使用 v2ray config 修改伪装的网址" + read -p "$(echo -e "(默认: [${cyan}https://liyafly.com$none]):")" new_proxy_site + [[ -z $new_proxy_site ]] && new_proxy_site="https://liyafly.com" + + case $new_proxy_site in + *[#$]*) + echo + echo -e " 由于这个脚本太辣鸡了..所以伪装的网址不能包含$red # $none或$red $ $none这两个符号.... " + echo + error + ;; + *) + echo + echo + echo -e "$yellow 伪装的网址 = ${cyan}${new_proxy_site}$none" + echo "----------------------------------------------------------------" + echo + break + ;; + esac + done +} + +install_caddy() { + _load download-caddy.sh + _download_caddy_file + _install_caddy_service + +} +caddy_config() { + # local email=$(shuf -i1-10000000000 -n1) + _load caddy-config.sh + # systemctl restart caddy + do_service restart caddy +} +v2ray_dynamic_port_start() { + echo + echo + while :; do + echo -e "请输入 "$yellow"V2Ray 动态端口开始 "$none"范围 ["$magenta"1-65535"$none"]" + read -p "$(echo -e "(默认开始端口: ${cyan}10000$none):")" v2ray_dynamic_port_start_input + [ -z $v2ray_dynamic_port_start_input ] && v2ray_dynamic_port_start_input=10000 + case $v2ray_dynamic_port_start_input in + $v2ray_port) + echo + echo " 不能和 V2Ray 端口一毛一样...." + echo + echo -e " 当前 V2Ray 端口:${cyan}$v2ray_port${none}" + error + ;; + [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) + if [[ $shadowsocks && $v2ray_dynamic_port_start_input == $ssport ]]; then + echo + echo -e "抱歉, 此端口跟 Shadowsocks 端口冲突...当前 Shadowsocks 端口: ${cyan}$ssport$none" + error + elif [[ $socks && $v2ray_dynamic_port_start_input == $socks_port ]]; then + echo + echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" + error + elif [[ $mtproto && $v2ray_dynamic_port_start_input == $mtproto_port ]]; then + echo + echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" + error + else + echo + echo + echo -e "$yellow V2Ray 动态端口开始 = $cyan$v2ray_dynamic_port_start_input$none" + echo "----------------------------------------------------------------" + echo + break + fi + + ;; + *) + error + ;; + esac + + done + + if [[ $v2ray_dynamic_port_start_input -lt $v2ray_port ]]; then + lt_v2ray_port=true + fi + if [[ $shadowsocks ]] && [[ $v2ray_dynamic_port_start_input -lt $ssport ]]; then + lt_ssport=true + fi + if [[ $socks ]] && [[ $v2ray_dynamic_port_start_input -lt $socks_port ]]; then + lt_socks_port=true + fi + if [[ $mtproto ]] && [[ $v2ray_dynamic_port_start_input -lt $mtproto_port ]]; then + lt_mtproto_port=true + fi + +} + +v2ray_dynamic_port_end() { + echo + while :; do + echo -e "请输入 "$yellow"V2Ray 动态端口结束 "$none"范围 ["$magenta"1-65535"$none"]" + read -p "$(echo -e "(默认结束端口: ${cyan}20000$none):")" v2ray_dynamic_port_end_input + [ -z $v2ray_dynamic_port_end_input ] && v2ray_dynamic_port_end_input=20000 + case $v2ray_dynamic_port_end_input in + [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) + + if [[ $v2ray_dynamic_port_end_input -le $v2ray_dynamic_port_start_input ]]; then + echo + echo " 不能小于或等于 V2Ray 动态端口开始范围" + echo + echo -e " 当前 V2Ray 动态端口开始:${cyan}$v2ray_dynamic_port_start_input${none}" + error + elif [ $lt_v2ray_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $v2ray_port ]]; then + echo + echo " V2Ray 动态端口结束范围 不能包括 V2Ray 端口..." + echo + echo -e " 当前 V2Ray 端口: ${cyan}$v2ray_port$none" + error + elif [ $lt_ssport ] && [[ ${v2ray_dynamic_port_end_input} -ge $ssport ]]; then + echo + echo " V2Ray 动态端口结束范围 不能包括 Shadowsocks 端口..." + echo + echo -e " 当前 Shadowsocks 端口: ${cyan}$ssport$none" + error + elif [ $lt_socks_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $socks_port ]]; then + echo + echo " V2Ray 动态端口结束范围 不能包括 Socks 端口..." + echo + echo -e " 当前 Socks 端口: ${cyan}$socks_port$none" + error + elif [ $lt_mtproto_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $mtproto_port ]]; then + echo + echo " V2Ray 动态端口结束范围 不能包括 MTProto 端口..." + echo + echo -e " 当前 MTProto 端口: ${cyan}$mtproto_port$none" + error + else + echo + echo + echo -e "$yellow V2Ray 动态端口结束 = $cyan$v2ray_dynamic_port_end_input$none" + echo "----------------------------------------------------------------" + echo + break + fi + ;; + *) + error + ;; + esac + + done + +} +change_v2ray_dynamicport() { + if [[ $v2ray_transport -ge 18 ]]; then + change_v2ray_dynamic_port_start + change_v2ray_dynamic_port_end + pause + del_port "multiport" + open_port "multiport" + backup_config v2ray_dynamicPort_start v2ray_dynamicPort_end + port_range="${v2ray_dynamic_port_start_input}-${v2ray_dynamic_port_end_input}" + config + # clear + echo + echo -e "$green 动态端口修改成功啦...你不需要修改 V2Ray 客户端配置...保持原有的配置即可...$none" + echo + else + echo + echo -e "$red ...当前传输协议木有启用动态端口...$none" + echo + while :; do + echo -e "是否需要修改传输协议 [${magenta}Y/N$none]" + read -p "$(echo -e "默认 [${cyan}N$none]:")" y_n + if [[ -z $y_n ]]; then + echo + echo -e "$green 已取消修改传输协议...$none" + echo + break + else + if [[ $y_n == [Yy] ]]; then + change_v2ray_transport + break + elif [[ $y_n == [Nn] ]]; then + echo + echo -e "$green 已取消修改传输协议...$none" + echo + break + else + error + fi + fi + done + + fi +} +change_v2ray_dynamic_port_start() { + echo + echo + while :; do + echo -e "请输入 "$yellow"V2Ray 动态端口开始 "$none"范围 ["$magenta"1-65535"$none"]" + read -p "$(echo -e "(当前动态开始端口: ${cyan}$v2ray_dynamicPort_start$none):")" v2ray_dynamic_port_start_input + [ -z $v2ray_dynamic_port_start_input ] && error && continue + case $v2ray_dynamic_port_start_input in + $v2ray_port) + echo + echo " 不能和 V2Ray 端口一毛一样...." + echo + echo -e " 当前 V2Ray 端口:${cyan}$v2ray_port${none}" + error + ;; + [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) + if [[ $shadowsocks && $v2ray_dynamic_port_start_input == $ssport ]]; then + echo + echo -e "抱歉, 此端口跟 Shadowsocks 端口冲突...当前 Shadowsocks 端口: ${cyan}$ssport$none" + error + elif [[ $socks && $v2ray_dynamic_port_start_input == $socks_port ]]; then + echo + echo -e "抱歉, 此端口跟 Socks 端口冲突...当前 Socks 端口: ${cyan}$socks_port$none" + error + elif [[ $mtproto && $v2ray_dynamic_port_start_input == $mtproto_port ]]; then + echo + echo -e "抱歉, 此端口跟 MTProto 端口冲突...当前 MTProto 端口: ${cyan}$mtproto_port$none" + error + else + echo + echo + echo -e "$yellow V2Ray 动态端口开始 = $cyan$v2ray_dynamic_port_start_input$none" + echo "----------------------------------------------------------------" + echo + break + fi + + ;; + *) + error + ;; + esac + + done + + if [[ $v2ray_dynamic_port_start_input -lt $v2ray_port ]]; then + lt_v2ray_port=true + fi + if [[ $shadowsocks ]] && [[ $v2ray_dynamic_port_start_input -lt $ssport ]]; then + lt_ssport=true + fi + if [[ $socks ]] && [[ $v2ray_dynamic_port_start_input -lt $socks_port ]]; then + lt_socks_port=true + fi + if [[ $mtproto ]] && [[ $v2ray_dynamic_port_start_input -lt $mtproto_port ]]; then + lt_mtproto_port=true + fi +} + +change_v2ray_dynamic_port_end() { + echo + while :; do + echo -e "请输入 "$yellow"V2Ray 动态端口结束 "$none"范围 ["$magenta"1-65535"$none"]" + read -p "$(echo -e "(当前动态结束端口: ${cyan}$v2ray_dynamicPort_end$none):")" v2ray_dynamic_port_end_input + [ -z $v2ray_dynamic_port_end_input ] && error && continue + case $v2ray_dynamic_port_end_input in + [1-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) + + if [[ $v2ray_dynamic_port_end_input -le $v2ray_dynamic_port_start_input ]]; then + echo + echo " 不能小于或等于 V2Ray 动态端口开始范围" + echo + echo -e " 当前 V2Ray 动态端口开始:${cyan}$v2ray_dynamic_port_start_input${none}" + error + elif [ $lt_v2ray_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $v2ray_port ]]; then + echo + echo " V2Ray 动态端口结束范围 不能包括 V2Ray 端口..." + echo + echo -e " 当前 V2Ray 端口: ${cyan}$v2ray_port$none" + error + elif [ $lt_ssport ] && [[ ${v2ray_dynamic_port_end_input} -ge $ssport ]]; then + echo + echo " V2Ray 动态端口结束范围 不能包括 Shadowsocks 端口..." + echo + echo -e " 当前 Shadowsocks 端口: ${cyan}$ssport$none" + error + elif [ $lt_socks_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $socks_port ]]; then + echo + echo " V2Ray 动态端口结束范围 不能包括 Socks 端口..." + echo + echo -e " 当前 Socks 端口: ${cyan}$socks_port$none" + error + elif [ $lt_mtproto_port ] && [[ ${v2ray_dynamic_port_end_input} -ge $mtproto_port ]]; then + echo + echo " V2Ray 动态端口结束范围 不能包括 MTProto 端口..." + echo + echo -e " 当前 MTProto 端口: ${cyan}$mtproto_port$none" + error + else + echo + echo + echo -e "$yellow V2Ray 动态端口结束 = $cyan$v2ray_dynamic_port_end_input$none" + echo "----------------------------------------------------------------" + echo + break + fi + ;; + *) + error + ;; + esac + + done + +} +change_v2ray_id() { + echo + while :; do + echo -e "是否确定要修改用户ID [${magenta}Y/N$none]" + read -p "$(echo -e "默认 [${cyan}N$none]:")" y_n + if [[ -z $y_n ]]; then + echo + echo -e "$green 已取消修改用户ID...$none" + echo + break + else + if [[ $y_n == [Yy] ]]; then + echo + echo + echo -e "$yellow 修改用户ID = $cyan确定$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config uuid + v2ray_id=$uuid + config + clear + view_v2ray_config_info + break + elif [[ $y_n == [Nn] ]]; then + echo + echo -e "$green 已取消修改用户ID...$none" + echo + break + else + error + fi + fi + done +} +change_domain() { + if [[ $v2ray_transport == [45] ]] && [[ $caddy ]]; then + while :; do + echo + echo -e "请输入一个 $magenta正确的域名$none,一定一定一定要正确,不!能!出!错!" + read -p "$(echo -e "(当前域名: ${cyan}$domain$none):") " new_domain + [ -z "$new_domain" ] && error && continue + if [[ $new_domain == $domain ]]; then + echo + echo -e " 跟当前域名一毛一样啊...修改个鸡鸡哦" + echo + error && continue + fi + echo + echo + echo -e "$yellow 你的域名 = $cyan$new_domain$none" + echo "----------------------------------------------------------------" + break + done + get_ip + echo + echo + echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" + echo + echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" + echo + echo -e "$yellow 请将 $magenta$new_domain$none $yellow解析到: $cyan$ip$none" + echo "----------------------------------------------------------------" + echo + + while :; do + + read -p "$(echo -e "(是否已经正确解析: [${magenta}Y$none]):") " record + if [[ -z "$record" ]]; then + error + else + if [[ "$record" == [Yy] ]]; then + domain_check + echo + echo + echo -e "$yellow 域名解析 = ${cyan}我确定已经有解析了$none" + echo "----------------------------------------------------------------" + echo + pause + # domain_check + backup_config domain + domain=$new_domain + caddy_config + config + clear + view_v2ray_config_info + break + else + error + fi + fi + + done + else + echo + echo -e "$red 抱歉...不支持修改...$none" + echo + echo -e " 备注..修改 TLS 域名仅支持传输协议为 ${yellow}WebSocket + TLS$none 或 ${yellow}HTTP/2$none 并且$yellow 自动配置 TLS = 打开$none" + echo + echo -e " 当前传输协议为: ${cyan}${transport[$v2ray_transport - 1]}${none}" + echo + if [[ $caddy ]]; then + echo -e " 自动配置 TLS = ${cyan}打开$none" + else + echo -e " 自动配置 TLS = $red关闭$none" + fi + echo + fi +} +change_path_config() { + if [[ $v2ray_transport == [45] ]] && [[ $caddy && $is_path ]]; then + echo + while :; do + echo -e "请输入想要 ${magenta}用来分流的路径$none , 例如 /233blog , 那么只需要输入 233blog 即可" + read -p "$(echo -e "(当前分流的路径: [${cyan}/${path}$none]):")" new_path + [[ -z $new_path ]] && error && continue + + case $new_path in + $path) + echo + echo -e " 大佬...跟 当前分流的路径 一毛一样啊...修改个鸡鸡哦 " + echo + error + ;; + *[/$]*) + echo + echo -e " 由于这个脚本太辣鸡了..所以分流的路径不能包含$red / $none或$red $ $none这两个符号.... " + echo + error + ;; + *) + echo + echo + echo -e "$yellow 分流的路径 = ${cyan}/${new_path}$none" + echo "----------------------------------------------------------------" + echo + break + ;; + esac + done + pause + backup_config path + path=$new_path + caddy_config + config + clear + view_v2ray_config_info + elif [[ $v2ray_transport == [45] ]] && [[ $caddy ]]; then + path_config_ask + if [[ $new_path ]]; then + backup_config +path + path=$new_path + proxy_site=$new_proxy_site + is_path=true + caddy_config + config + clear + view_v2ray_config_info + else + echo + echo + echo " 给大佬点赞....好果断的放弃配置 网站伪装 和 路径分流" + echo + echo + fi + else + echo + echo -e "$red 抱歉...不支持修改...$none" + echo + echo -e " 备注..修改 分流的路径 仅支持传输协议为 ${yellow}WebSocket + TLS$none 或 ${yellow}HTTP/2$none 并且$yellow 自动配置 TLS = 打开$none" + echo + echo -e " 当前传输协议为: ${cyan}${transport[$v2ray_transport - 1]}${none}" + echo + if [[ $caddy ]]; then + echo -e " 自动配置 TLS = ${cyan}打开$none" + else + echo -e " 自动配置 TLS = $red关闭$none" + fi + echo + change_v2ray_transport_ask + fi + +} +change_proxy_site_config() { + if [[ $v2ray_transport == [45] ]] && [[ $caddy && $is_path ]]; then + echo + while :; do + echo -e "请输入 ${magenta}一个正确的$none ${cyan}网址$none 用来作为 ${cyan}网站的伪装$none , 例如 https://liyafly.com" + echo -e "举例...你当前的域名是$green $domain $none, 伪装的网址的是 https://liyafly.com" + echo -e "然后打开你的域名时候...显示出来的内容就是来自 https://liyafly.com 的内容" + echo -e "其实就是一个反代...明白就好..." + echo -e "如果不能伪装成功...可以使用 v2ray config 修改伪装的网址" + read -p "$(echo -e "(当前伪装的网址: [${cyan}${proxy_site}$none]):")" new_proxy_site + [[ -z $new_proxy_site ]] && error && continue + + case $new_proxy_site in + *[#$]*) + echo + echo -e " 由于这个脚本太辣鸡了..所以伪装的网址不能包含$red # $none或$red $ $none这两个符号.... " + echo + error + ;; + *) + echo + echo + echo -e "$yellow 伪装的网址 = ${cyan}${new_proxy_site}$none" + echo "----------------------------------------------------------------" + echo + break + ;; + esac + done + pause + backup_config proxy_site + proxy_site=$new_proxy_site + caddy_config + echo + echo + echo " 哎哟...好像是修改成功了..." + echo + echo -e " 赶紧打开你的域名 ${cyan}https://${domain}$none 检查一下看看" + echo + echo + elif [[ $v2ray_transport == [45] ]] && [[ $caddy ]]; then + path_config_ask + if [[ $new_path ]]; then + backup_config +path + path=$new_path + proxy_site=$new_proxy_site + is_path=true + caddy_config + config + clear + view_v2ray_config_info + else + echo + echo + echo " 给大佬点赞....好果断的放弃配置 网站伪装 和 路径分流" + echo + echo + fi + else + echo + echo -e "$red 抱歉...不支持修改...$none" + echo + echo -e " 备注..修改 伪装的网址 仅支持传输协议为 ${yellow}WebSocket + TLS$none 或 ${yellow}HTTP/2$none 并且$yellow 自动配置 TLS = 打开$none" + echo + echo -e " 当前传输协议为: ${cyan}${transport[$v2ray_transport - 1]}${none}" + echo + if [[ $caddy ]]; then + echo -e " 自动配置 TLS = ${cyan}打开$none" + else + echo -e " 自动配置 TLS = $red关闭$none" + fi + echo + change_v2ray_transport_ask + fi + +} +domain_check() { + # test_domain=$(dig $new_domain +short) + test_domain=$(ping $new_domain -c 1 | grep -oE -m1 "([0-9]{1,3}\.){3}[0-9]{1,3}") + if [[ $test_domain != $ip ]]; then + echo + echo -e "$red 检测域名解析错误....$none" + echo + echo -e " 你的域名: $yellow$new_domain$none 未解析到: $cyan$ip$none" + echo + echo -e " 你的域名当前解析到: $cyan$test_domain$none" + echo + echo "备注...如果你的域名是使用 Cloudflare 解析的话..在 Status 那里点一下那图标..让它变灰" + echo + exit 1 + fi +} +disable_path() { + if [[ $v2ray_transport == [45] ]] && [[ $caddy && $is_path ]]; then + echo + + while :; do + echo -e "是否关闭 ${yellow}网站伪装 和 路径分流${none} [${magenta}Y/N$none]" + read -p "$(echo -e "(默认 [${cyan}N$none]):") " y_n + [[ -z "$y_n" ]] && y_n="n" + if [[ "$y_n" == [Yy] ]]; then + echo + echo + echo -e "$yellow 关闭 网站伪装 和 路径分流 = $cyan是$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config -path + is_path='' + caddy_config + config + clear + view_v2ray_config_info + break + elif [[ "$y_n" == [Nn] ]]; then + echo + echo -e " $green已取消关闭 网站伪装 和 路径分流 ....$none" + echo + break + else + error + fi + + done + else + echo + echo -e "$red 抱歉...不支持修改...$none" + echo + echo -e " 当前传输协议为: ${cyan}${transport[$v2ray_transport - 1]}${none}" + echo + if [[ $caddy ]]; then + echo -e " 自动配置 TLS = ${cyan}打开$none" + else + echo -e " 自动配置 TLS = $red关闭$none" + fi + echo + if [[ $is_path ]]; then + echo -e " 路径分流 = ${cyan}打开$none" + else + echo -e " 路径分流 = $red关闭$none" + fi + echo + echo -e " 必须为 WebSocket + TLS 或 HTTP/2 传输协议, 自动配置 TLS = ${cyan}打开$none, 路径分流 = ${cyan}打开$none, 才能修改" + echo + + fi +} +blocked_hosts() { + if [[ $ban_ad ]]; then + local _info="$green已开启$none" + else + local _info="$red已关闭$none" + fi + _opt='' + while :; do + echo + echo -e "$yellow 1. $none开启 广告拦截" + echo + echo -e "$yellow 2. $none关闭 广告拦截" + echo + echo "备注: 广告拦截是基于 域名 拦截的..所以也许会造成浏览网页的时候出现部分元素留白..或者其他问题" + echo + echo "反馈问题或请求拦截更多域名: https://github.com/233boy/v2ray/issues" + echo + echo -e "当前广告拦截状态: $_info" + echo + read -p "$(echo -e "请选择 [${magenta}1-2$none]:")" _opt + if [[ -z $_opt ]]; then + error + else + case $_opt in + 1) + if [[ $ban_ad ]]; then + echo + echo -e " 大胸弟...难不成你没有看到 (当前广告拦截状态: $_info) 这个帅帅的提示么.....还开启个鸡鸡哦" + echo + else + echo + echo + echo -e "$yellow 广告拦截 = $cyan开启$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config +ad + ban_ad=true + config + echo + echo + echo -e "$green 广告拦截已开启...如果出现异常..那就关闭它咯$none" + echo + fi + break + ;; + 2) + if [[ $ban_ad ]]; then + echo + echo + echo -e "$yellow 广告拦截 = $cyan关闭$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config -ad + ban_ad='' + config + echo + echo + echo -e "$red 广告拦截已关闭...不过你也可以随时重新开启 ...只要你喜欢$none" + echo + else + echo + echo -e " 大胸弟...难不成你没有看到 (当前广告拦截状态: $_info) 这个帅帅的提示么.....还关闭个鸡鸡哦" + echo + fi + break + ;; + *) + error + ;; + esac + fi + done + +} +change_v2ray_alterId() { + echo + while :; do + echo -e "请输入 ${yellow}alterId${none} 的数值 [${magenta}0-65535$none]" + read -p "$(echo -e "(当前数值是: ${cyan}$alterId$none):") " new_alterId + [[ -z $new_alterId ]] && error && continue + case $new_alterId in + $alterId) + echo + echo -e " 大佬...跟 当前 alterId 一毛一样啊...修改个鸡鸡哦 " + echo + error + ;; + [0-9] | [1-9][0-9] | [1-9][0-9][0-9] | [1-9][0-9][0-9][0-9] | [1-5][0-9][0-9][0-9][0-9] | 6[0-4][0-9][0-9][0-9] | 65[0-4][0-9][0-9] | 655[0-3][0-5]) + echo + echo + echo -e "$yellow alterId = $cyan$new_alterId$none" + echo "----------------------------------------------------------------" + echo + pause + backup_config alterId + alterId=$new_alterId + config + clear + view_v2ray_config_info + break + ;; + *) + error + ;; + esac + done +} + +custom_uuid() { + echo + while :; do + echo -e "请输入$yello自定义的 UUID$none...(${cyan}UUID 格式一定要对!!!$none)" + read -p "$(echo -e "(当前 UUID: ${cyan}${v2ray_id}$none)"): " myuuid + [ -z "$myuuid" ] && error && continue + case $myuuid in + $v2ray_id) + echo + echo -e " 大佬...跟 当前 UUID 一毛一样啊...修改个鸡鸡哦 " + echo + error + ;; + *[/$]* | *\&*) + echo + echo -e " 由于这个脚本太辣鸡了..所以 UUID 不能包含$red / $none或$red $ $none或$red & $none这三个符号.... " + echo + error + ;; + *) + echo + echo + echo -e "$yellow UUID = $cyan$myuuid$none" + echo + echo -e " 如果 UUID 格式不正确.. V2Ray 会跪...使用$cyan v2ray reuuid$none 复活" + echo "----------------------------------------------------------------" + echo + pause + uuid=$myuuid + backup_config uuid + v2ray_id=$uuid + config + clear + view_v2ray_config_info + break + ;; + esac + done +} +v2ray_service() { + while :; do + echo + echo -e "$yellow 1. $none启动 V2Ray" + echo + echo -e "$yellow 2. $none停止 V2Ray" + echo + echo -e "$yellow 3. $none重启 V2Ray" + echo + echo -e "$yellow 4. $none查看访问日志" + echo + echo -e "$yellow 5. $none查看错误日志" + echo + read -p "$(echo -e "请选择 [${magenta}1-5$none]:")" _opt + if [[ -z $_opt ]]; then + error + else + case $_opt in + 1) + start_v2ray + break + ;; + 2) + stop_v2ray + break + ;; + 3) + restart_v2ray + break + ;; + 4) + view_v2ray_log + break + ;; + 5) + view_v2ray_error_log + break + ;; + *) + error + ;; + esac + fi + done +} +start_v2ray() { + if [[ $v2ray_pid ]]; then + echo + echo -e "${green} V2Ray 正在运行...无需再启动$none" + echo + else + + # systemctl start v2ray + service v2ray start >/dev/null 2>&1 + if [[ $? -ne 0 ]]; then + echo + echo -e "${red} V2Ray 启动失败!$none" + echo + else + echo + echo -e "${green} V2Ray 已启动$none" + echo + fi + + fi +} +stop_v2ray() { + if [[ $v2ray_pid ]]; then + # systemctl stop v2ray + service v2ray stop >/dev/null 2>&1 + echo + echo -e "${green} V2Ray 已停止$none" + echo + else + echo + echo -e "${red} V2Ray 没有在运行$none" + echo + fi +} +restart_v2ray() { + # systemctl restart v2ray + service v2ray restart >/dev/null 2>&1 + if [[ $? -ne 0 ]]; then + echo + echo -e "${red} V2Ray 重启失败!$none" + echo + else + echo + echo -e "${green} V2Ray 重启完成 $none" + echo + fi +} +view_v2ray_log() { + echo + echo -e "$green 按 Ctrl + C 即可退出...$none" + echo + tail -f /var/log/v2ray/access.log +} +view_v2ray_error_log() { + echo + echo -e "$green 按 Ctrl + C 即可退出...$none" + echo + tail -f /var/log/v2ray/error.log +} +download_v2ray_config() { + while :; do + echo + echo -e "$yellow 1. $none直接下载 V2Ray 客户端配置文件(仅支持 Xshell)" + echo + echo -e "$yellow 2. $none生成 V2Ray 客户端配置文件下载链接" + echo + echo -e "$yellow 3. $none生成 V2Ray 配置信息链接" + echo + echo -e "$yellow 4. $none生成 V2Ray 配置二维码链接" + echo + read -p "$(echo -e "请选择 [${magenta}1-4$none]:")" other_opt + if [[ -z $other_opt ]]; then + error + else + case $other_opt in + 1) + get_v2ray_config + break + ;; + 2) + get_v2ray_config_link + break + ;; + 3) + get_v2ray_config_info_link + break + ;; + 4) + get_v2ray_config_qr_link + break + ;; + *) + error + ;; + esac + fi + done +} +get_v2ray_config() { + config + echo + echo " 如果你当前使用的 SSH 客户端不是 Xshell 的话...下载 V2Ray 客户端配置文件将会出现卡死情况" + echo + while :; do + read -p "$(echo -e "不要BB...哥就是在使用 Xshell [${magenta}Y$none]:")" is_xshell + if [[ -z $is_xshell ]]; then + error + else + if [[ $is_xshell == [yY] ]]; then + echo + echo "开始下载....请选择 V2Ray 客户端配置文件保存位置" + echo + # sz /etc/v2ray/233blog_v2ray.zip + local tmpfile="/tmp/233blog_v2ray_config_$RANDOM.json" + cp -f $v2ray_client_config $tmpfile + sz $tmpfile + echo + echo + echo -e "$green 下载完成咯...$none" + echo + # echo -e "$yellow 解压密码 = ${cyan}233blog.com$none" + # echo + echo -e "$yellow SOCKS 监听端口 = ${cyan}2333${none}" + echo + echo -e "${yellow} HTTP 监听端口 = ${cyan}6666$none" + echo + echo "V2Ray 客户端使用教程: https://${_site}/post/4/" + echo + break + else + error + fi + fi + done + [[ -f $tmpfile ]] && rm -rf $tmpfile + +} +get_v2ray_config_link() { + echo + echo -e "$green 正在生成链接.... 稍等片刻即可....$none" + echo + local random=$(echo $RANDOM-$RANDOM-$RANDOM | base64 -w 0) + local link=$(curl -s --upload-file $v2ray_client_config "https://transfer.sh/${random}_v2ray6_v2ray.json") + if [[ $link ]]; then + echo + echo "---------- V2Ray 客户端配置文件链接 -------------" + echo + echo -e "$yellow 链接 = $cyan$link$none" + echo + echo -e "$yellow SOCKS 监听端口 = ${cyan}2333${none}" + echo + echo -e "${yellow} HTTP 监听端口 = ${cyan}6666$none" + echo + echo " V2Ray 客户端使用教程: https://${_site}/post/4/" + echo + echo "备注...链接将在 14 天后失效" + echo + echo "提醒...请不要把链接分享出去...除非你有特别的理由...." + echo + else + echo + echo -e "$red 哎呀呀呀...出错咯...请重试$none" + echo + fi +} +create_v2ray_config_text() { + + get_transport_args + + echo + echo + echo "---------- V2Ray 配置信息 -------------" + if [[ $v2ray_transport == [45] ]]; then + if [[ ! $caddy ]]; then + echo + echo " 警告!请自行配置 TLS...教程: https://${_site}/post/3/" + fi + echo + echo "地址 (Address) = ${domain}" + echo + echo "端口 (Port) = 443" + echo + echo "用户ID (User ID / UUID) = ${v2ray_id}" + echo + echo "额外ID (Alter Id) = ${alterId}" + echo + echo "传输协议 (Network) = ${net}" + echo + echo "伪装类型 (header type) = ${header}" + echo + echo "伪装域名 (host) = ${domain}" + echo + echo "路径 (path) = ${_path}" + echo + echo "TLS (Enable TLS) = 打开" + echo + if [[ $ban_ad ]]; then + echo " 备注: 广告拦截已开启.." + echo + fi + else + [[ -z $ip ]] && get_ip + echo + echo "地址 (Address) = ${ip}" + echo + echo "端口 (Port) = $v2ray_port" + echo + echo "用户ID (User ID / UUID) = ${v2ray_id}" + echo + echo "额外ID (Alter Id) = ${alterId}" + echo + echo "传输协议 (Network) = ${net}" + echo + echo "伪装类型 (header type) = ${header}" + echo + fi + if [[ $v2ray_transport -ge 18 ]] && [[ $ban_ad ]]; then + echo "备注: 动态端口已启用...广告拦截已开启..." + echo + elif [[ $v2ray_transport -ge 18 ]]; then + echo "备注: 动态端口已启用..." + echo + elif [[ $ban_ad ]]; then + echo "备注: 广告拦截已开启.." + echo + fi + echo "---------- END -------------" + echo + echo "V2Ray 客户端使用教程: https://${_site}/post/4/" + echo +} +get_v2ray_config_info_link() { + echo + echo -e "$green 正在生成链接.... 稍等片刻即可....$none" + echo + create_v2ray_config_text >/tmp/233blog_v2ray.txt + local random=$(echo $RANDOM-$RANDOM-$RANDOM | base64 -w 0) + local link=$(curl -s --upload-file /tmp/233blog_v2ray.txt "https://transfer.sh/${random}_v2ray6_v2ray.txt") + if [[ $link ]]; then + echo + echo "---------- V2Ray 配置信息链接-------------" + echo + echo -e "$yellow 链接 = $cyan$link$none" + echo + echo -e " V2Ray 客户端使用教程: https://${_site}/post/4/" + echo + echo "备注...链接将在 14 天后失效..." + echo + echo "提醒...请不要把链接分享出去...除非你有特别的理由...." + echo + else + echo + echo -e "$red 哎呀呀呀...出错咯...请重试$none" + echo + fi + rm -rf /tmp/233blog_v2ray.txt +} +get_v2ray_config_qr_link() { + + create_vmess_URL_config + + _load qr.sh + _qr_create +} + +get_v2ray_multi_vmess_URL_QR() { + echo "---------- V2Ray vmess URL / V2RayNG v0.4.1+ / V2RayN v2.1+ / 仅适合部分客户端 -------------" + get_ip + _load jqcmd.sh + jq_gen_json + jq_printvmess $ip "[233]" + [[ $v6ip ]] && jq_printvmess $v6ip "[233]" + + return +} + +get_v2ray_vmess_URL_link() { + + echo "---------- V2Ray vmess URL / V2RayNG v0.4.1+ / V2RayN v2.1+ / 仅适合部分客户端 -------------" + get_ip + _load jqcmd.sh + jq_gen_json + jq_printvmess $ip "[233]" + [[ $v6ip ]] && jq_printvmess $v6ip "[233]" + + return + + create_vmess_URL_config + local vmess="vmess://$(cat /etc/v2ray/vmess_qr.json | base64 -w 0)" + echo + echo "---------- V2Ray vmess URL / V2RayNG v0.4.1+ / V2RayN v2.1+ / 仅适合部分客户端 -------------" + echo + echo -e ${cyan}$vmess${none} + echo + if [[ -f /etc/v2ray/vmess_qrv6.json ]]; then + local vmessv6="vmess://$(cat /etc/v2ray/vmess_qrv6.json | base64 -w 0)" + echo "IPv6:地址直链:" + echo -e ${cyan}$vmessv6${none} + fi + rm -f /etc/v2ray/vmess_qr.json /etc/v2ray/vmess_qrv6.json +} +other() { + while :; do + echo + echo -e "$yellow 1. $none安装 BBR" + echo + echo -e "$yellow 2. $none安装 LotServer(锐速)" + echo + echo -e "$yellow 3. $none卸载 LotServer(锐速)" + echo + read -p "$(echo -e "请选择 [${magenta}1-3$none]:")" _opt + if [[ -z $_opt ]]; then + error + else + case $_opt in + 1) + install_bbr + break + ;; + 2) + install_lotserver + break + ;; + 3) + uninstall_lotserver + break + ;; + *) + error + ;; + esac + fi + done +} +install_bbr() { + local test1=$(sed -n '/net.ipv4.tcp_congestion_control/p' /etc/sysctl.conf) + local test2=$(sed -n '/net.core.default_qdisc/p' /etc/sysctl.conf) + if [[ $(uname -r | cut -b 1) -eq 4 ]]; then + case $(uname -r | cut -b 3-4) in + 9. | [1-9][0-9]) + if [[ $test1 == "net.ipv4.tcp_congestion_control = bbr" && $test2 == "net.core.default_qdisc = fq" ]]; then + local is_bbr=true + else + local try_enable_bbr=true + fi + ;; + esac + fi + if [[ $is_bbr ]]; then + echo + echo -e "$green BBR 已经启用啦...无需再安装$none" + echo + elif [[ $try_enable_bbr ]]; then + _load bbr.sh + _open_bbr + echo + echo -e "$green ..由于你的 VPS 内核支持开启 BBR ...已经为你启用 BBR 优化....$none" + echo + else + # https://teddysun.com/489.html + bash <(curl -s -L https://github.com/teddysun/across/raw/master/bbr.sh) + fi +} +install_lotserver() { + # https://moeclub.org/2017/03/08/14/ + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" + bash /tmp/appex.sh 'install' + rm -rf /tmp/appex.sh +} +uninstall_lotserver() { + # https://moeclub.org/2017/03/08/14/ + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" + bash /tmp/appex.sh 'uninstall' + rm -rf /tmp/appex.sh +} + +open_port() { + _load iptables.sh + _iptables_add $1 +} +del_port() { + _load iptables.sh + _iptables_del $1 +} +update() { + while :; do + echo + echo -e "$yellow 1. $none更新 V2Ray 主程序" + echo + echo -e "$yellow 2. $none更新 V2Ray 管理脚本" + echo + read -p "$(echo -e "请选择 [${magenta}1-2$none]:")" _opt + if [[ -z $_opt ]]; then + error + else + case $_opt in + 1) + update_v2ray + break + ;; + 2) + update_v2ray.sh + exit + break + ;; + *) + error + ;; + esac + fi + done +} +update_v2ray() { + _load download-v2ray.sh + _update_v2ray_version + + if [[ $ssray ]]; then + _load download-ssray.sh + _update_ssray_version + ssray_save_config + fi +} +update_v2ray.sh() { + if [[ $_test ]]; then + local latest_version=$(curl -H 'Cache-Control: no-cache' -s -L "https://raw.githubusercontent.com/233boy/v2ray/test/v2ray.sh" | grep '_version' -m1 | cut -d\" -f2) + else + local latest_version=$(curl -H 'Cache-Control: no-cache' -s -L "https://raw.githubusercontent.com/233boy/v2ray/master/v2ray.sh" | grep '_version' -m1 | cut -d\" -f2) + fi + + if [[ ! $latest_version ]]; then + echo + echo -e " $red获取 V2Ray 最新版本失败!!!$none" + echo + echo -e " 请尝试执行如下命令: $green echo 'nameserver 8.8.8.8' >/etc/resolv.conf $none" + echo + echo " 然后再继续...." + echo + exit 1 + fi + + if [[ $latest_version == $_version ]]; then + echo + echo -e "$green 木有发现新版本 $none" + echo + else + echo + echo -e " $green 咦...发现新版本耶....正在拼命更新.......$none" + echo + cd /etc/v2ray/233boy/v2ray + git pull + cp -f /etc/v2ray/233boy/v2ray/v2ray.sh $_v2ray_sh + chmod +x $_v2ray_sh + echo + echo -e "$green 更新成功啦...当前 V2Ray 管理脚本 版本: ${cyan}$latest_version$none" + echo + fi + +} +uninstall_v2ray() { + _load uninstall.sh +} +config() { + _load config.sh + + if [[ $v2ray_port == "80" ]]; then + if [[ $cmd == "yum" ]]; then + [[ $(pgrep "httpd") ]] && systemctl stop httpd >/dev/null 2>&1 + [[ $(command -v httpd) ]] && yum remove httpd -y >/dev/null 2>&1 + else + [[ $(pgrep "apache2") ]] && service apache2 stop >/dev/null 2>&1 + [[ $(command -v apache2) ]] && apt-get remove apache2* -y >/dev/null 2>&1 + fi + fi + do_service restart v2ray +} +backup_config() { + _load backup.sh + _backup "$@" + +} + +do_service() { + if [[ $systemd ]]; then + systemctl $1 $2 + else + service $2 $1 + fi +} +_help() { + echo + echo "........... V2Ray 管理脚本帮助信息 by ${_site} .........." + echo -e " + ${green}v2ray menu $none管理 V2Ray (同等于直接输入 v2ray) + + ${green}v2ray info $none查看 V2Ray 配置信息 + + ${green}v2ray config $none修改 V2Ray 配置 + + ${green}v2ray link $none生成 V2Ray 客户端配置文件链接 + + ${green}v2ray textlink $none生成 V2Ray 配置信息链接 + + ${green}v2ray qr $none生成 V2Ray 配置二维码链接 + + ${green}v2ray ss $none修改 Shadowsocks 配置 + + ${green}v2ray ssinfo $none查看 Shadowsocks 配置信息 + + ${green}v2ray ssqr $none生成 Shadowsocks 配置二维码链接 + + ${green}v2ray status $none查看 V2Ray 运行状态 + + ${green}v2ray start $none启动 V2Ray + + ${green}v2ray stop $none停止 V2Ray + + ${green}v2ray restart $none重启 V2Ray + + ${green}v2ray log $none查看 V2Ray 运行日志 + + ${green}v2ray update $none更新 V2Ray + + ${green}v2ray traffic $none查看 V2Ray 流量 + + ${green}v2ray update.sh $none更新 V2Ray 管理脚本 + + ${green}v2ray uninstall $none卸载 V2Ray +" +} +menu() { + local _lists=( + "查看 V2Ray 配置" + "修改 V2Ray 配置" + "下载 V2Ray 配置 / 生成配置信息链接 / 生成二维码链接" + "查看 Shadowsocks 配置 / 生成二维码链接" + "修改 Shadowsocks 配置" + "查看 MTProto 配置 / 修改 MTProto 配置" + "查看 Socks5 配置 / 修改 Socks5 配置" + "启动 / 停止 / 重启 / 查看日志" + "更新 V2Ray / 更新 V2Ray 管理脚本" + "卸载 V2Ray" + "其他" + "查看 V2ray 流量统计" + ) + clear + while :; do + echo + echo "........... V2Ray 管理脚本 $_version by ${_site} .........." + echo + echo -e "## V2Ray 版本: $cyan$v2ray_ver$none / V2Ray 状态: $v2ray_status ##" + echo + echo "帮助说明: https://${_site}/post/1/" + echo + echo "反馈问题: https://github.com/233boy/v2ray/issues" + echo + echo "TG 群组: https://t.me/blog233" + echo + echo "捐赠脚本作者: https://${_site}/donate/" + echo + echo "捐助 V2Ray: https://www.v2ray.com/chapter_00/02_donate.html" + for ((i = 1; i <= ${#_lists[*]}; i++)); do + if [[ "$i" -le 9 ]]; then + echo + echo -e "$yellow $i. $none${_lists[$i - 1]}" + else + echo + echo -e "$yellow $i. $none${_lists[$i - 1]}" + fi + done + echo + echo -e "温馨提示...如果你不想执行选项...按$yellow Ctrl + C $none即可退出" + echo + read -p "$(echo -e "请选择菜单 [${magenta}1-${#_lists[*]}$none]:")" choose + if [[ -z $choose ]]; then + exit 1 + else + case $choose in + 1) + view_v2ray_config_info + _yellow " ---- 翻查多用户的vmess link请用v2ray murl查看。" + break + ;; + 2) + change_v2ray_config + break + ;; + 3) + download_v2ray_config + break + ;; + 4) + get_shadowsocks_config + break + ;; + 5) + change_shadowsocks_config + break + ;; + 6) + _load mtproto.sh + _mtproto_main + break + ;; + 7) + _load socks.sh + _socks_main + break + ;; + 8) + v2ray_service + break + ;; + 9) + update + break + ;; + 10) + uninstall_v2ray + break + ;; + 11) + other + break + ;; + 12) + view_v2ray_traffic + break + ;; + *) + error + ;; + esac + fi + done +} +args=$1 +[ -z $1 ] && args="menu" +case $args in +menu) + menu + ;; +i | info) + view_v2ray_config_info + _yellow " ---- 翻查多用户的vmess link请用v2ray murl查看。" + echo + ;; +c | config) + change_v2ray_config + ;; +l | link) + get_v2ray_config_link + ;; +L | infolink) + get_v2ray_config_info_link + ;; +q | qr) + get_v2ray_config_qr_link + ;; +s | ss) + change_shadowsocks_config + ;; +S | ssinfo) + view_shadowsocks_config_info + ;; +Q | ssqr) + get_shadowsocks_config_qr_link + ;; +socks) + _load socks.sh + _socks_main + ;; +socksinfo) + _load socks.sh + _view_socks_info + ;; +tg) + _load mtproto.sh + _mtproto_main + ;; +tginfo) + _load mtproto.sh + _view_mtproto_info + ;; +bt) + _load bt.sh + _ban_bt_main + ;; +status) + echo + if [[ $v2ray_transport == [45] && $caddy ]]; then + echo -e " V2Ray 状态: $v2ray_status / Caddy 状态: $caddy_run_status" + else + echo -e " V2Ray 状态: $v2ray_status" + fi + echo + ;; +start) + start_v2ray + ;; +stop) + stop_v2ray + ;; +restart) + [[ $v2ray_transport == [45] && $caddy ]] && do_service restart caddy + restart_v2ray + ;; +reload) + config + [[ $v2ray_transport == [45] && $caddy ]] && caddy_config + clear + view_v2ray_config_info + ;; +time) + date -s "$(curl -sI g.cn | grep Date | cut -d' ' -f3-6)Z" + ;; +log) + view_v2ray_log + ;; +url | URL) + get_v2ray_vmess_URL_link + ;; +murl | MURL | mqr | MQR) + get_v2ray_multi_vmess_URL_QR + ;; +u | update) + update_v2ray + ;; +U | update.sh) + update_v2ray.sh + exit + ;; +un | uninstall) + uninstall_v2ray + ;; +reinstall) + uninstall_v2ray + if [[ $is_uninstall_v2ray ]]; then + cd + cd - >/dev/null 2>&1 + bash <(curl -s -L https://git.io/v2ray.sh) + fi + ;; +[aA][Ii] | [Dd]) + change_v2ray_alterId + ;; +[aA][Ii][aA][Ii] | [Dd][Dd]) + custom_uuid + ;; +reuuid) + backup_config uuid + v2ray_id=$uuid + config + clear + view_v2ray_config_info + ;; +v | version) + echo + echo -e " 当前 V2Ray 版本: ${green}$v2ray_ver$none / 当前 V2Ray 管理脚本版本: ${cyan}$_version$none" + echo + ;; +bbr) + other + ;; +traffic) + view_v2ray_traffic + ;; +help | *) + _help + ;; +esac