v2ray.sh 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. #!/bin/bash
  2. # Author: Jrohy
  3. # github: https://github.com/Jrohy/multi-v2ray
  4. #定时任务北京执行时间(0~23)
  5. BEIJING_UPDATE_TIME=3
  6. #记录最开始运行脚本的路径
  7. BEGIN_PATH=$(pwd)
  8. #安装方式, 0为全新安装, 1为保留v2ray配置更新
  9. INSTALL_WAY=0
  10. #定义操作变量, 0为否, 1为是
  11. HELP=0
  12. REMOVE=0
  13. CHINESE=0
  14. BASE_SOURCE_PATH="https://multi.netlify.app"
  15. UTIL_PATH="/etc/v2ray_util/util.cfg"
  16. UTIL_CFG="$BASE_SOURCE_PATH/v2ray_util/util_core/util.cfg"
  17. BASH_COMPLETION_SHELL="$BASE_SOURCE_PATH/v2ray"
  18. CLEAN_IPTABLES_SHELL="$BASE_SOURCE_PATH/v2ray_util/global_setting/clean_iptables.sh"
  19. #Centos 临时取消别名
  20. [[ -f /etc/redhat-release && -z $(echo $SHELL|grep zsh) ]] && unalias -a
  21. [[ -z $(echo $SHELL|grep zsh) ]] && ENV_FILE=".bashrc" || ENV_FILE=".zshrc"
  22. #######color code########
  23. RED="31m"
  24. GREEN="32m"
  25. YELLOW="33m"
  26. BLUE="36m"
  27. FUCHSIA="35m"
  28. colorEcho(){
  29. COLOR=$1
  30. echo -e "\033[${COLOR}${@:2}\033[0m"
  31. }
  32. msg () {
  33. local colors="${ADM_tmp}/ADM-color"
  34. if [[ ! -e $colors ]]; then
  35. COLOR[0]='\033[1;37m' #BRAN='\033[1;37m'
  36. COLOR[1]='\e[31m' #VERMELHO='\e[31m'
  37. COLOR[2]='\e[32m' #VERDE='\e[32m'
  38. COLOR[3]='\e[33m' #AMARELO='\e[33m'
  39. COLOR[4]='\e[34m' #AZUL='\e[34m'
  40. COLOR[5]='\e[91m' #MAGENTA='\e[35m'
  41. COLOR[6]='\033[1;97m' #MAG='\033[1;36m'
  42. else
  43. local COL=0
  44. for number in $(cat $colors); do
  45. case $number in
  46. 1)COLOR[$COL]='\033[1;37m';;
  47. 2)COLOR[$COL]='\e[31m';;
  48. 3)COLOR[$COL]='\e[32m';;
  49. 4)COLOR[$COL]='\e[33m';;
  50. 5)COLOR[$COL]='\e[34m';;
  51. 6)COLOR[$COL]='\e[35m';;
  52. 7)COLOR[$COL]='\033[1;36m';;
  53. esac
  54. let COL++
  55. done
  56. fi
  57. NEGRITO='\e[1m'
  58. SEMCOR='\e[0m'
  59. case $1 in
  60. -ne)cor="${COLOR[1]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";;
  61. -ama)cor="${COLOR[3]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";;
  62. -verm)cor="${COLOR[3]}${NEGRITO}[!] ${COLOR[1]}" && echo -e "${cor}${2}${SEMCOR}";;
  63. -verm2)cor="${COLOR[1]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";;
  64. -azu)cor="${COLOR[6]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";;
  65. -verd)cor="${COLOR[2]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";;
  66. -bra)cor="${COLOR[0]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";;
  67. "-bar2"|"-bar")cor="${COLOR[1]}=====================================================" && echo -e "${SEMCOR}${cor}${SEMCOR}";;
  68. -bar3)cor="${COLOR[1]}-----------------------------------------------------" && echo -e "${SEMCOR}${cor}${SEMCOR}";;
  69. esac
  70. }
  71. print_center(){
  72. local x
  73. local y
  74. #text="$*"
  75. text="$2"
  76. #x=$(( ($(tput cols) - ${#text}) / 2))
  77. x=$(( ( 54 - ${#text}) / 2))
  78. echo -ne "\E[6n";read -sdR y; y=$(echo -ne "${y#*[}" | cut -d';' -f1)
  79. #echo -e "\033[${y};${x}f$*"
  80. msg "$1" "\033[${y};${x}f$2"
  81. }
  82. fun_bar(){
  83. comando="$1"
  84. txt="$2"
  85. _=$(
  86. $comando > /dev/null 2>&1
  87. ) & > /dev/null
  88. pid=$!
  89. while [[ -d /proc/$pid ]]; do
  90. echo -ne " \033[1;33m$txt["
  91. for((i=0; i<10; i++)); do
  92. echo -ne "\033[1;31m##"
  93. sleep 0.2
  94. done
  95. echo -ne "\033[1;33m]"
  96. sleep 1s
  97. echo
  98. tput cuu1 && tput dl1
  99. done
  100. echo -e " \033[1;33m$txt[\033[1;31m####################\033[1;33m] - \033[1;32m100%\033[0m"
  101. sleep 1s
  102. }
  103. #######get params#########
  104. while [[ $# > 0 ]];do
  105. key="$1"
  106. case $key in
  107. --remove)
  108. REMOVE=1
  109. ;;
  110. -h|--help)
  111. HELP=1
  112. ;;
  113. -k|--keep)
  114. INSTALL_WAY=1
  115. colorEcho ${BLUE} "keep config to update\n"
  116. ;;
  117. --zh)
  118. CHINESE=1
  119. colorEcho ${BLUE} "安装中文版..\n"
  120. ;;
  121. *)
  122. # unknown option
  123. ;;
  124. esac
  125. shift # past argument or value
  126. done
  127. #############################
  128. help(){
  129. echo "bash v2ray.sh [-h|--help] [-k|--keep] [--remove]"
  130. echo " -h, --help Show help"
  131. echo " -k, --keep keep the config.json to update"
  132. echo " --remove remove v2ray,xray && multi-v2ray"
  133. echo " no params to new install"
  134. return 0
  135. }
  136. removeV2Ray() {
  137. #卸载V2ray脚本
  138. bash <(curl -L -s https://multi.netlify.app/go.sh) --remove >/dev/null 2>&1
  139. rm -rf /etc/v2ray >/dev/null 2>&1
  140. rm -rf /var/log/v2ray >/dev/null 2>&1
  141. #卸载Xray脚本
  142. bash <(curl -L -s https://multi.netlify.app/go.sh) --remove -x >/dev/null 2>&1
  143. rm -rf /etc/xray >/dev/null 2>&1
  144. rm -rf /var/log/xray >/dev/null 2>&1
  145. #清理v2ray相关iptable规则
  146. bash <(curl -L -s $CLEAN_IPTABLES_SHELL)
  147. #卸载multi-v2ray
  148. pip uninstall v2ray_util -y
  149. rm -rf /usr/share/bash-completion/completions/v2ray.bash >/dev/null 2>&1
  150. rm -rf /usr/share/bash-completion/completions/v2ray >/dev/null 2>&1
  151. rm -rf /usr/share/bash-completion/completions/xray >/dev/null 2>&1
  152. rm -rf /etc/bash_completion.d/v2ray.bash >/dev/null 2>&1
  153. rm -rf /usr/local/bin/v2ray >/dev/null 2>&1
  154. rm -rf /etc/v2ray_util >/dev/null 2>&1
  155. #删除v2ray定时更新任务
  156. crontab -l|sed '/SHELL=/d;/v2ray/d'|sed '/SHELL=/d;/xray/d' > crontab.txt
  157. crontab crontab.txt >/dev/null 2>&1
  158. rm -f crontab.txt >/dev/null 2>&1
  159. if [[ ${PACKAGE_MANAGER} == 'dnf' || ${PACKAGE_MANAGER} == 'yum' ]];then
  160. systemctl restart crond >/dev/null 2>&1
  161. else
  162. systemctl restart cron >/dev/null 2>&1
  163. fi
  164. #删除multi-v2ray环境变量
  165. sed -i '/v2ray/d' ~/$ENV_FILE
  166. sed -i '/xray/d' ~/$ENV_FILE
  167. source ~/$ENV_FILE
  168. colorEcho ${GREEN} "uninstall success!"
  169. }
  170. closeSELinux() {
  171. #禁用SELinux
  172. if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
  173. sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  174. setenforce 0
  175. fi
  176. }
  177. checkSys() {
  178. #检查是否为Root
  179. [ $(id -u) != "0" ] && { colorEcho ${RED} "Error: You must be root to run this script"; exit 1; }
  180. if [[ `command -v apt-get` ]];then
  181. PACKAGE_MANAGER='apt-get'
  182. elif [[ `command -v dnf` ]];then
  183. PACKAGE_MANAGER='dnf'
  184. elif [[ `command -v yum` ]];then
  185. PACKAGE_MANAGER='yum'
  186. else
  187. colorEcho $RED "Not support OS!"
  188. exit 1
  189. fi
  190. }
  191. #安装依赖
  192. installDependent(){
  193. if [[ ${PACKAGE_MANAGER} == 'dnf' || ${PACKAGE_MANAGER} == 'yum' ]];then
  194. ${PACKAGE_MANAGER} install socat crontabs bash-completion which -y
  195. else
  196. fun_bar "${PACKAGE_MANAGER} update" 'APT UPDATE '
  197. fun_bar "${PACKAGE_MANAGER} install socat cron bash-completion ntpdate gawk jq uuid-runtime -y" 'INSTALL DEPENDENCIAS '
  198. msg -bar
  199. fi
  200. #install python3 & pip
  201. source <(curl -sL https://python3.netlify.app/install.sh)
  202. }
  203. updateProject() {
  204. [[ ! $(type pip 2>/dev/null) ]] && colorEcho $RED "pip no install!" && exit 1
  205. pip install -U v2ray_util
  206. if [[ -e $UTIL_PATH ]];then
  207. [[ -z $(cat $UTIL_PATH|grep lang) ]] && echo "lang=en" >> $UTIL_PATH
  208. else
  209. mkdir -p /etc/v2ray_util
  210. curl $UTIL_CFG > $UTIL_PATH
  211. fi
  212. [[ $CHINESE == 1 ]] && sed -i "s/lang=en/lang=zh/g" $UTIL_PATH
  213. rm -f /usr/local/bin/v2ray >/dev/null 2>&1
  214. ln -s $(which v2ray-util) /usr/local/bin/v2ray
  215. rm -f /usr/local/bin/xray >/dev/null 2>&1
  216. ln -s $(which v2ray-util) /usr/local/bin/xray
  217. #移除旧的v2ray bash_completion脚本
  218. [[ -e /etc/bash_completion.d/v2ray.bash ]] && rm -f /etc/bash_completion.d/v2ray.bash
  219. [[ -e /usr/share/bash-completion/completions/v2ray.bash ]] && rm -f /usr/share/bash-completion/completions/v2ray.bash
  220. #更新v2ray bash_completion脚本
  221. curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/v2ray
  222. curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/xray
  223. if [[ -z $(echo $SHELL|grep zsh) ]];then
  224. source /usr/share/bash-completion/completions/v2ray
  225. source /usr/share/bash-completion/completions/xray
  226. fi
  227. #安装V2ray主程序
  228. [[ ${INSTALL_WAY} == 0 ]] && bash <(curl -L -s https://multi.netlify.app/go.sh)
  229. }
  230. #时间同步
  231. timeSync() {
  232. if [[ ${INSTALL_WAY} == 0 ]];then
  233. echo -e "${Info} Time Synchronizing.. ${Font}"
  234. if [[ `command -v ntpdate` ]];then
  235. ntpdate pool.ntp.org
  236. elif [[ `command -v chronyc` ]];then
  237. chronyc -a makestep
  238. fi
  239. if [[ $? -eq 0 ]];then
  240. echo -e "${OK} Time Sync Success ${Font}"
  241. echo -e "${OK} now: `date -R`${Font}"
  242. fi
  243. fi
  244. }
  245. profileInit() {
  246. #清理v2ray模块环境变量
  247. [[ $(grep v2ray ~/$ENV_FILE) ]] && sed -i '/v2ray/d' ~/$ENV_FILE && source ~/$ENV_FILE
  248. #解决Python3中文显示问题
  249. [[ -z $(grep PYTHONIOENCODING=utf-8 ~/$ENV_FILE) ]] && echo "export PYTHONIOENCODING=utf-8" >> ~/$ENV_FILE && source ~/$ENV_FILE
  250. #全新安装的新配置
  251. [[ ${INSTALL_WAY} == 0 ]] && v2ray new
  252. echo ""
  253. }
  254. installFinish() {
  255. #回到原点
  256. cd ${BEGIN_PATH}
  257. [[ ${INSTALL_WAY} == 0 ]] && WAY="install" || WAY="update"
  258. colorEcho ${GREEN} "multi-v2ray ${WAY} success!\n"
  259. config='/etc/v2ray/config.json'
  260. tmp='/etc/v2ray/temp.json'
  261. jq 'del(.inbounds[].streamSettings.kcpSettings[])' < /etc/v2ray/config.json >> /etc/v2ray/tmp.json
  262. rm -rf /etc/v2ray/config.json
  263. jq '.inbounds[].streamSettings += {"network":"ws","wsSettings":{"path": "/ADMRufu/","headers": {"Host": "ejemplo.com"}}}' < /etc/v2ray/tmp.json >> /etc/v2ray/config.json
  264. chmod 777 /etc/v2ray/config.json
  265. if [[ ${INSTALL_WAY} == 0 ]]; then
  266. #clear
  267. v2ray info
  268. msg -bar
  269. print_center -verd "INSTALACION FINALIZADA"
  270. print_center -ama "Por favor verifique el log"
  271. msg -bar
  272. msg -ama "►► Presione enter para continuar ◄◄"
  273. read foo
  274. fi
  275. }
  276. main() {
  277. [[ ${HELP} == 1 ]] && help && return
  278. [[ ${REMOVE} == 1 ]] && removeV2Ray && return
  279. [[ ${INSTALL_WAY} == 0 ]] && clear && msg -bar && print_center -verd "INSTALADO v2ray" && msg -bar
  280. checkSys
  281. installDependent
  282. closeSELinux
  283. timeSync
  284. updateProject
  285. profileInit
  286. installFinish
  287. }
  288. main