install-v2ray.sh 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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. CLEAN_IPTABLES_SHELL="$BASE_SOURCE_PATH/v2ray_util/global_setting/clean_iptables.sh"
  16. BASH_COMPLETION_SHELL="$BASE_SOURCE_PATH/v2ray.bash"
  17. UTIL_CFG="$BASE_SOURCE_PATH/v2ray_util/util_core/util.cfg"
  18. UTIL_PATH="/etc/v2ray_util/util.cfg"
  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. #######get params#########
  33. while [[ $# > 0 ]];do
  34. key="$1"
  35. case $key in
  36. --remove)
  37. REMOVE=1
  38. ;;
  39. -h|--help)
  40. HELP=1
  41. ;;
  42. -k|--keep)
  43. INSTALL_WAY=1
  44. colorEcho ${BLUE} "keep v2ray profile to update\n"
  45. ;;
  46. --zh)
  47. CHINESE=1
  48. colorEcho ${BLUE} "安装中文版..\n"
  49. ;;
  50. *)
  51. # unknown option
  52. ;;
  53. esac
  54. shift # past argument or value
  55. done
  56. #############################
  57. help(){
  58. echo "bash multi-v2ray.sh [-h|--help] [-k|--keep] [--remove]"
  59. echo " -h, --help Show help"
  60. echo " -k, --keep keep the v2ray config.json to update"
  61. echo " --remove remove v2ray && multi-v2ray"
  62. echo " no params to new install"
  63. return 0
  64. }
  65. removeV2Ray() {
  66. #卸载V2ray官方脚本
  67. systemctl stop v2ray >/dev/null 2>&1
  68. systemctl disable v2ray >/dev/null 2>&1
  69. service v2ray stop >/dev/null 2>&1
  70. update-rc.d -f v2ray remove >/dev/null 2>&1
  71. rm -rf /etc/v2ray/ >/dev/null 2>&1
  72. rm -rf /usr/bin/v2ray >/dev/null 2>&1
  73. rm -rf /var/log/v2ray/ >/dev/null 2>&1
  74. rm -rf /lib/systemd/system/v2ray.service >/dev/null 2>&1
  75. rm -rf /etc/init.d/v2ray >/dev/null 2>&1
  76. #清理v2ray相关iptable规则
  77. bash <(curl -L -s $CLEAN_IPTABLES_SHELL)
  78. #卸载multi-v2ray
  79. pip uninstall v2ray_util -y
  80. rm -rf /etc/bash_completion.d/v2ray.bash >/dev/null 2>&1
  81. rm -rf /usr/local/bin/v2ray >/dev/null 2>&1
  82. rm -rf /etc/v2ray_util >/dev/null 2>&1
  83. #删除v2ray定时更新任务
  84. crontab -l|sed '/SHELL=/d;/v2ray/d' > crontab.txt
  85. crontab crontab.txt >/dev/null 2>&1
  86. rm -f crontab.txt >/dev/null 2>&1
  87. if [[ ${OS} == 'CentOS' || ${OS} == 'Fedora' ]];then
  88. service crond restart >/dev/null 2>&1
  89. else
  90. service cron restart >/dev/null 2>&1
  91. fi
  92. #删除multi-v2ray环境变量
  93. sed -i '/v2ray/d' ~/$ENV_FILE
  94. source ~/$ENV_FILE
  95. colorEcho ${GREEN} "uninstall success!"
  96. }
  97. closeSELinux() {
  98. #禁用SELinux
  99. if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
  100. sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  101. setenforce 0
  102. fi
  103. }
  104. checkSys() {
  105. #检查是否为Root
  106. [ $(id -u) != "0" ] && { colorEcho ${RED} "Error: You must be root to run this script"; exit 1; }
  107. #检查系统信息
  108. if [[ -e /etc/redhat-release ]];then
  109. if [[ $(cat /etc/redhat-release | grep Fedora) ]];then
  110. OS='Fedora'
  111. PACKAGE_MANAGER='dnf'
  112. else
  113. OS='CentOS'
  114. PACKAGE_MANAGER='yum'
  115. fi
  116. elif [[ $(cat /etc/issue | grep Debian) ]];then
  117. OS='Debian'
  118. PACKAGE_MANAGER='apt-get'
  119. elif [[ $(cat /etc/issue | grep Ubuntu) ]];then
  120. OS='Ubuntu'
  121. PACKAGE_MANAGER='apt-get'
  122. elif [[ $(cat /etc/issue | grep Raspbian) ]];then
  123. OS='Raspbian'
  124. PACKAGE_MANAGER='apt-get'
  125. else
  126. colorEcho ${RED} "Not support OS, Please reinstall OS and retry!"
  127. exit 1
  128. fi
  129. }
  130. #安装依赖
  131. installDependent(){
  132. if [[ ${OS} == 'CentOS' || ${OS} == 'Fedora' ]];then
  133. ${PACKAGE_MANAGER} install ntpdate socat crontabs lsof which -y
  134. else
  135. ${PACKAGE_MANAGER} update
  136. ${PACKAGE_MANAGER} install ntpdate socat cron lsof -y
  137. fi
  138. #install python3 & pip3
  139. bash <(curl -sL https://git.io/fhqMz)
  140. }
  141. #设置定时升级任务
  142. planUpdate(){
  143. if [[ $CHINESE == 1 ]];then
  144. #计算北京时间早上3点时VPS的实际时间
  145. ORIGIN_TIME_ZONE=$(date -R|awk '{printf"%d",$6}')
  146. LOCAL_TIME_ZONE=${ORIGIN_TIME_ZONE%00}
  147. BEIJING_ZONE=8
  148. DIFF_ZONE=$[$BEIJING_ZONE-$LOCAL_TIME_ZONE]
  149. LOCAL_TIME=$[$BEIJING_UPDATE_TIME-$DIFF_ZONE]
  150. if [ $LOCAL_TIME -lt 0 ];then
  151. LOCAL_TIME=$[24+$LOCAL_TIME]
  152. elif [ $LOCAL_TIME -ge 24 ];then
  153. LOCAL_TIME=$[$LOCAL_TIME-24]
  154. fi
  155. colorEcho ${BLUE} "beijing time ${BEIJING_UPDATE_TIME}, VPS time: ${LOCAL_TIME}\n"
  156. else
  157. LOCAL_TIME=3
  158. fi
  159. OLD_CRONTAB=$(crontab -l)
  160. echo "SHELL=/bin/bash" >> crontab.txt
  161. echo "${OLD_CRONTAB}" >> crontab.txt
  162. echo "0 ${LOCAL_TIME} * * * bash <(curl -L -s https://install.direct/go.sh) | tee -a /root/v2rayUpdate.log && service v2ray restart" >> crontab.txt
  163. crontab crontab.txt
  164. sleep 1
  165. if [[ ${OS} == 'CentOS' || ${OS} == 'Fedora' ]];then
  166. service crond restart
  167. else
  168. service cron restart
  169. fi
  170. rm -f crontab.txt
  171. colorEcho ${GREEN} "success open schedule update task: beijing time ${BEIJING_UPDATE_TIME}\n"
  172. }
  173. updateProject() {
  174. local DOMAIN=""
  175. [[ ! $(type pip3 2>/dev/null) ]] && colorEcho $RED "pip3 no install!" && exit 1
  176. if [[ -e /usr/local/multi-v2ray/multi-v2ray.conf ]];then
  177. TEMP_VALUE=$(cat /usr/local/multi-v2ray/multi-v2ray.conf|grep domain|awk 'NR==1')
  178. DOMAIN=${TEMP_VALUE/*=}
  179. rm -rf /usr/local/multi-v2ray
  180. fi
  181. pip3 install -U v2ray_util
  182. if [[ -e $UTIL_PATH ]];then
  183. [[ -z $(cat $UTIL_PATH|grep lang) ]] && echo "lang=en" >> $UTIL_PATH
  184. else
  185. mkdir -p /etc/v2ray_util
  186. curl $UTIL_CFG > $UTIL_PATH
  187. [[ ! -z $DOMAIN ]] && sed -i "s/^domain.*/domain=${DOMAIN}/g" $UTIL_PATH
  188. fi
  189. [[ $CHINESE == 1 ]] && sed -i "s/lang=en/lang=zh/g" $UTIL_PATH
  190. rm -f /usr/local/bin/v2ray >/dev/null 2>&1
  191. ln -s $(which v2ray-util) /usr/local/bin/v2ray
  192. #更新v2ray bash_completion脚本
  193. curl $BASH_COMPLETION_SHELL > /etc/bash_completion.d/v2ray.bash
  194. [[ -z $(echo $SHELL|grep zsh) ]] && source /etc/bash_completion.d/v2ray.bash
  195. #安装/更新V2ray主程序
  196. bash <(curl -L -s https://install.direct/go.sh)
  197. }
  198. #时间同步
  199. timeSync() {
  200. if [[ ${INSTALL_WAY} == 0 ]];then
  201. echo -e "${Info} Time Synchronizing.. ${Font}"
  202. ntpdate pool.ntp.org
  203. if [[ $? -eq 0 ]];then
  204. echo -e "${OK} Time Sync Success ${Font}"
  205. echo -e "${OK} now: `date -R`${Font}"
  206. sleep 1
  207. else
  208. echo -e "${Error} Time sync fail, please run command to sync:${Font}${Yellow}ntpdate pool.ntp.org${Font}"
  209. fi
  210. fi
  211. }
  212. profileInit() {
  213. #清理v2ray模块环境变量
  214. [[ $(grep v2ray ~/$ENV_FILE) ]] && sed -i '/v2ray/d' ~/$ENV_FILE && source ~/$ENV_FILE
  215. #解决Python3中文显示问题
  216. [[ -z $(grep PYTHONIOENCODING=utf-8 ~/$ENV_FILE) ]] && echo "export PYTHONIOENCODING=utf-8" >> ~/$ENV_FILE && source ~/$ENV_FILE
  217. # 加入v2ray tab补全环境变量
  218. [[ -z $(echo $SHELL|grep zsh) && -z $(grep v2ray.bash ~/$ENV_FILE) ]] && echo "source /etc/bash_completion.d/v2ray.bash" >> ~/$ENV_FILE && source ~/$ENV_FILE
  219. #全新安装的新配置
  220. if [[ ${INSTALL_WAY} == 0 ]];then
  221. v2ray new
  222. else
  223. v2ray convert
  224. fi
  225. bash <(curl -L -s $CLEAN_IPTABLES_SHELL)
  226. echo ""
  227. }
  228. installFinish() {
  229. #回到原点
  230. cd ${BEGIN_PATH}
  231. [[ ${INSTALL_WAY} == 0 ]] && WAY="install" || WAY="update"
  232. colorEcho ${GREEN} "multi-v2ray ${WAY} success!\n"
  233. clear
  234. v2ray info
  235. echo -e "please input 'v2ray' command to manage v2ray\n"
  236. }
  237. main() {
  238. [[ ${HELP} == 1 ]] && help && return
  239. [[ ${REMOVE} == 1 ]] && removeV2Ray && return
  240. [[ ${INSTALL_WAY} == 0 ]] && colorEcho ${BLUE} "Instalando v2ray....\n"
  241. checkSys
  242. installDependent
  243. closeSELinux
  244. timeSync
  245. #设置定时任务
  246. [[ -z $(crontab -l|grep v2ray) ]] && planUpdate
  247. updateProject
  248. profileInit
  249. service v2ray restart
  250. installFinish
  251. }
  252. main