Files
trojanZ/trojan-master/install.sh
T
2026-07-26 00:09:57 +08:00

211 lines
6.4 KiB
Bash

#!/bin/bash
# Author: Jrohy
# github: https://github.com/Jrohy/trojan
# Supported invocation modes:
# bash install.sh [--remove]
# source <(curl -fsSL https://<your-domain>/install.sh) [--remove]
if (return 0 2>/dev/null); then
sourced=1
else
sourced=0
fi
#定义操作变量, 0为否, 1为是
help=0
remove=0
update=0
download_url="https://github.com/Jrohy/trojan/releases/download/"
version_check="https://api.github.com/repos/Jrohy/trojan/releases/latest"
service_url="https://raw.githubusercontent.com/Jrohy/trojan/master/asset/trojan-web.service"
[[ -e /var/lib/trojan-manager ]] && update=1
#Centos 临时取消别名
[[ -f /etc/redhat-release && -z $(echo $SHELL|grep zsh) ]] && unalias -a
[[ -z $(echo $SHELL|grep zsh) ]] && shell_way="bash" || shell_way="zsh"
#######color code########
red="31m"
green="32m"
yellow="33m"
blue="36m"
fuchsia="35m"
colorEcho(){
color=$1
echo -e "\033[${color}${@:2}\033[0m"
}
#######get params#########
while [[ $# > 0 ]];do
key="$1"
case $key in
--remove)
remove=1
;;
-h|--help)
help=1
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
#############################
help(){
echo "Usage: bash install.sh [-h|--help] [--remove]"
echo " or: source <(curl -fsSL https://<your-domain>/install.sh) [--remove]"
echo " -h, --help Show help"
echo " --remove remove trojan"
return 0
}
removeTrojan() {
#移除trojan
rm -rf /usr/bin/trojan >/dev/null 2>&1
rm -rf /usr/local/etc/trojan >/dev/null 2>&1
rm -f /etc/systemd/system/trojan.service >/dev/null 2>&1
#移除trojan管理程序
rm -f /usr/local/bin/trojan >/dev/null 2>&1
rm -rf /var/lib/trojan-manager >/dev/null 2>&1
rm -f /etc/systemd/system/trojan-web.service >/dev/null 2>&1
systemctl daemon-reload
#移除trojan的专用db
docker rm -f trojan-mysql trojan-mariadb >/dev/null 2>&1
rm -rf /home/mysql /home/mariadb >/dev/null 2>&1
#移除环境变量
sed -i '/trojan/d' ~/.${shell_way}rc
source ~/.${shell_way}rc
colorEcho ${green} "uninstall success!"
}
checkSys() {
#检查是否为Root
[ $(id -u) != "0" ] && { colorEcho ${red} "Error: You must be root to run this script"; return 1; }
arch=$(uname -m 2> /dev/null)
if [[ $arch != x86_64 && $arch != aarch64 ]];then
colorEcho $yellow "not support $arch machine".
return 1
fi
if [[ `command -v apt-get` ]];then
package_manager='apt-get'
elif [[ `command -v dnf` ]];then
package_manager='dnf'
elif [[ `command -v yum` ]];then
package_manager='yum'
else
colorEcho $red "Not support OS!"
return 1
fi
# 缺失/usr/local/bin路径时自动添加
[[ -z `echo $PATH|grep /usr/local/bin` ]] && { echo 'export PATH=$PATH:/usr/local/bin' >> /etc/bashrc; source /etc/bashrc; }
}
#安装依赖
installDependent(){
if [[ ${package_manager} == 'dnf' || ${package_manager} == 'yum' ]];then
${package_manager} install socat crontabs bash-completion -y
else
${package_manager} update
${package_manager} install socat cron bash-completion xz-utils -y
fi
}
setupCron() {
if [[ `crontab -l 2>/dev/null|grep acme` ]]; then
if [[ -z `crontab -l 2>/dev/null|grep trojan-web` || `crontab -l 2>/dev/null|grep trojan-web|grep "&"` ]]; then
#计算北京时间早上3点时VPS的实际时间
origin_time_zone=$(date -R|awk '{printf"%d",$6}')
local_time_zone=${origin_time_zone%00}
beijing_zone=8
beijing_update_time=3
diff_zone=$[$beijing_zone-$local_time_zone]
local_time=$[$beijing_update_time-$diff_zone]
if [ $local_time -lt 0 ];then
local_time=$[24+$local_time]
elif [ $local_time -ge 24 ];then
local_time=$[$local_time-24]
fi
crontab -l 2>/dev/null|sed '/acme.sh/d' > crontab.txt
echo "0 ${local_time}"' * * * systemctl stop trojan-web; "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null; systemctl start trojan-web' >> crontab.txt
crontab crontab.txt
rm -f crontab.txt
fi
fi
}
installTrojan(){
local show_tip=0
if [[ $update == 1 ]];then
systemctl stop trojan-web >/dev/null 2>&1
rm -f /usr/local/bin/trojan
fi
lastest_version=$(curl -H 'Cache-Control: no-cache' -s "$version_check" | grep 'tag_name' | cut -d\" -f4)
echo "正在下载管理程序`colorEcho $blue $lastest_version`版本..."
[[ $arch == x86_64 ]] && bin="trojan-linux-amd64" || bin="trojan-linux-arm64"
curl -L "$download_url/$lastest_version/$bin" -o /usr/local/bin/trojan
chmod +x /usr/local/bin/trojan
if [[ ! -e /etc/systemd/system/trojan-web.service ]];then
show_tip=1
curl -L $service_url -o /etc/systemd/system/trojan-web.service
systemctl daemon-reload
systemctl enable trojan-web
fi
#命令补全环境变量
[[ -z $(grep trojan ~/.${shell_way}rc) ]] && echo "source <(trojan completion ${shell_way})" >> ~/.${shell_way}rc
source ~/.${shell_way}rc
if [[ $update == 0 ]];then
colorEcho $green "安装trojan管理程序成功!\n"
echo -e "运行命令`colorEcho $blue trojan`可进行trojan管理\n"
/usr/local/bin/trojan
else
if [[ `cat /usr/local/etc/trojan/config.json|grep -w "\"db\""` ]];then
sed -i "s/\"db\"/\"database\"/g" /usr/local/etc/trojan/config.json
systemctl restart trojan
fi
/usr/local/bin/trojan upgrade db
if [[ -z `cat /usr/local/etc/trojan/config.json|grep sni` ]];then
/usr/local/bin/trojan upgrade config
fi
systemctl restart trojan-web
colorEcho $green "更新trojan管理程序成功!\n"
fi
setupCron
[[ $show_tip == 1 ]] && echo "浏览器访问'`colorEcho $blue https://域名`'可在线trojan多用户管理"
}
main(){
[[ ${help} == 1 ]] && help && return
[[ ${remove} == 1 ]] && removeTrojan && return
[[ $update == 0 ]] && echo "正在安装trojan管理程序.." || echo "正在更新trojan管理程序.."
checkSys || return 1
[[ $update == 0 ]] && installDependent
installTrojan
}
main "$@"
result=$?
# Do not terminate the interactive shell when the script was invoked by source.
if [[ $sourced == 1 ]]; then
return $result
fi
exit $result