#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH LANG=en_US.UTF-8 STRIPE_LINE="----------------------------------------------------" DOUBLE_STRIPE_LINE="============================================" HTTP_STR="http" XP_VERSION="v1.1.12" API_HOST="https://api.xp.cn" DL_HOST="https://dl.xp.cn" current_dir=$(pwd) INSTALL_LOG_PATH="${current_dir}/xp-install.log" start_time=`date +%s` IDC_CODE="" if [ $(whoami) != "root" ];then echo "xp面板安装命令需要root权限执行" exit 1; fi is64bit=$(getconf LONG_BIT) if [ "${is64bit}" != '64' ];then echo "xp面板仅支持64位系统安装"; fi arch_check=$(uname -m) if [ "${arch_check}" != "x86_64" ] && [ "${arch_check}" != "amd64" ]; then echo "xp面板仅支持x86_64或者amd64架构CPU的系统安装"; fi # Centos6不支持安装 centos6_check=$(cat /etc/redhat-release | grep ' 6.' | grep -iE 'centos|Red Hat') if [ "${centos6_check}" ];then echo "xp面板不支持Centos6,请更换Centos7/8或更高版本的系统" exit 1 fi # ubuntu16以下不支持安装 ubuntu_check=$(cat /etc/issue|grep Ubuntu|awk '{print $2}'|cut -f 1 -d '.') if [ "${ubuntu_check}" ] && [ "${ubuntu_check}" -lt "16" ];then echo "xp面板不支持Ubuntu ${ubuntu_check},请更换Ubuntu18/20或更高版本的系统" exit 1 fi hostname_check=$(cat /etc/hostname) if [ -z "${hostname_check}" ];then echo "无法安装xp面板,因为当前主机名hostname为空,请设置hostname后重新安装" exit 1 fi Get_LocalInfo(){ if [ -s "/etc/redhat-release" ];then SYS_VERSION=$(cat /etc/redhat-release | sed 's/\\n//g' | sed 's/\\l//g') elif [ -s "/etc/issue" ]; then SYS_VERSION=$(cat /etc/issue | sed 's/\\n//g' | sed 's/\\l//g' | tr -d '\n' | tr -d '\n') fi SYS_INFO=$(uname -a) SYS_BIT=$(getconf LONG_BIT) MEM_TOTAL=$(free -m|grep Mem|awk '{print $2}') CPU_INFO=$(getconf _NPROCESSORS_ONLN) DISK_USE=$(df -h / | tail -n 1 | awk '{printf "size:%s;used:%s;avil:%s;percent:%s", $2, $3, $4, $5}') } cd ~ SETUP_PATH="/xp" Get_Sysinfo(){ Get_LocalInfo echo -e ${SYS_VERSION} echo -e Bit:${SYS_BIT} Mem:${MEM_TOTAL}M Core:${CPU_INFO} echo -e ${SYS_INFO} echo -e "${DOUBLE_STRIPE_LINE}" echo -e "请截图以上报错信息发给客服人员" echo -e "${DOUBLE_STRIPE_LINE}" if [ -f "/usr/bin/qrencode" ];then echo -e "微信扫码联系企业微信技术求助" echo -e "${DOUBLE_STRIPE_LINE}" qrencode -t ANSIUTF8 "https://work.weixin.qq.com/kfid/kfc8e99c5e9fb4761c6" echo -e "${DOUBLE_STRIPE_LINE}" else echo -e "手机访问以下链接、扫码联系企业微信技术求助" echo -e "${DOUBLE_STRIPE_LINE}" echo -e "联系链接:https://work.weixin.qq.com/kfid/kfc8e99c5e9fb4761c6" echo -e "${DOUBLE_STRIPE_LINE}" fi } Red_Err(){ echo "${DOUBLE_STRIPE_LINE}"; printf '\033[1;31;40m%b\033[0m\n' "$@"; Get_Sysinfo Analysis_Log exit 1; } # 检测是否装了别的环境 Env_Check(){ mysqld_exists=$(ps -ef |grep mysqld|grep -v grep|grep -v /www/server/mysql) php_exists=$(ps -ef|grep php-fpm|grep master|grep -v /www/server/php) nginx_exists=$(ps -ef|grep nginx|grep master|grep -v /www/server/nginx) httpd_exists=$(ps -ef |grep -E 'httpd|apache'|grep -v /www/server/apache|grep -v grep) if [ "${php_exists}" ] || [ "${mysqld_exists}" ] || [ "${nginx_exists}" ] || [ "${httpd_exists}" ];then Force_Install_Confirm fi } # 强制安装确认 Force_Install_Confirm(){ if [ "${INSTALL_FORCE}" ];then return fi echo -e "${STRIPE_LINE}" echo -e "检查已有其他Web/mysql环境,继续安装可能影响现有站点及数据" echo -e "Web/mysql service is alreday installed,Can't install panel" echo -e "${STRIPE_LINE}" echo -e "已知风险/Enter yes to force installation" read -p "输入yes强制安装: " yes; if [ "$yes" != "yes" ];then echo -e "------------" echo "取消安装" exit; fi start_time=`date +%s` INSTALL_FORCE="true" } # 获取包管理器 Get_PM(){ if [ -f "/usr/bin/yum" ] && [ -d "/etc/yum.repos.d" ]; then PM="yum" elif [ -f "/usr/bin/apt-get" ] && [ -f "/usr/bin/dpkg" ]; then PM="apt-get" fi } # 自动挂载Swap Auto_Swap_Mem(){ MEM_TOTAL=$(free -g|grep Mem|awk '{print $2}') if [ "${MEM_TOTAL}" -le "1" ];then swap=$(free |grep Swap|awk '{print $2}') if [ "${swap}" -gt 1 ];then echo "Swap total sizse: $swap"; return; fi if [ ! -d /www ];then mkdir /www fi swap_file="/www/swap" dd if=/dev/zero of=$swap_file bs=1M count=1025 mkswap -f $swap_file swapon $swap_file echo "$swap_file swap swap defaults 0 0" >> /etc/fstab swap=`free |grep Swap|awk '{print $2}'` if [ $swap -gt 1 ];then echo "Swap total sizse: $swap"; return; fi sed -i "/\/www\/swap/d" /etc/fstab rm -f $swap_file fi } Add_Service(){ if [ "${PM}" == "yum" ] || [ "${PM}" == "dnf" ]; then chkconfig --add xpd chkconfig --level 2345 xpd on sudo cp ${SETUP_PATH}/init/xpd.service /usr/lib/systemd/system/xpd.service sudo chmod +x /usr/lib/systemd/system/xpd.service sudo systemctl enable xpd elif [ "${PM}" == "apt-get" ]; then sudo update-rc.d xpd defaults fi } # 设置软件源 Set_Centos_Repo(){ huawei_check=$(cat /etc/motd |grep "Huawei Cloud") if [ "${huawei_check}" ] && [ "${is64bit}" == "64" ];then \cp -rpa /etc/yum.repos.d/ /etc/yumBak sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.epel.cloud|g' /etc/yum.repos.d/CentOS-*.repo rm -f /etc/yum.repos.d/epel.repo rm -f /etc/yum.repos.d/epel-* fi aliyun_check=$(cat /etc/motd|grep "Alibaba Cloud ") if [ "${aliyun_check}" ] && [ "${is64bit}" == "64" ] && [ ! -f "/etc/yum.repos.d/Centos-vault-8.5.2111.repo" ];then rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo wget https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo -O /etc/yum.repos.d/Centos-vault-8.5.2111.repo wget https://mirrors.aliyun.com/repo/epel-archive-8.repo -O /etc/yum.repos.d/epel-archive-8.repo sed -i 's/mirrors.cloud.aliyuncs.com/url_tmp/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo && sed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo && sed -i 's/url_tmp/mirrors.aliyun.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo sed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/epel-archive-8.repo fi mirror_check=$(cat /etc/yum.repos.d/CentOS-Linux-AppStream.repo |grep "[^#]mirror.centos.org") if [ "${mirror_check}" ] && [ "${is64bit}" == "64" ];then \cp -rpa /etc/yum.repos.d/ /etc/yumBak sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.epel.cloud|g' /etc/yum.repos.d/CentOS-*.repo fi } # 安装rpm的基础包 Install_RPM_Base_Pkg(){ yum_path=/etc/yum.conf centos8_check=$(cat /etc/redhat-release | grep ' 8.' | grep -iE 'centos|Red Hat') if [ "${centos8_check}" ];then Set_Centos_Repo fi is_exc=$(cat $yum_path|grep httpd) if [ "$is_exc" = "" ];then echo "exclude=httpd nginx php mysql mairadb python-psutil python2-psutil" >> $yum_path fi if [ -f "/etc/redhat-release" ] && [ $(cat /etc/os-release|grep PLATFORM_ID|grep -oE "el8") ];then yum config-manager --set-enabled powertools yum config-manager --set-enabled PowerTools fi if [ -f "/etc/redhat-release" ] && [ $(cat /etc/os-release|grep PLATFORM_ID|grep -oE "el9") ];then dnf config-manager --set-enabled crb -y fi # 同步服务器时间 echo 'Synchronizing system time...' get_server_time=$(curl -sS --connect-timeout 3 -m 60 ${API_HOST}/api/getTime) if [ "${get_server_time}" ];then date -s "$(date -d @$get_server_time +"%Y-%m-%d %H:%M:%S")" fi if [ -z "${centos8_check}" ]; then yum install ntp -y rm -rf /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 尝试同步国际时间(从ntp服务器) ntpdate 0.asia.pool.ntp.org setenforce 0 fi sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config yum_packs="libcurl-devel wget tar gcc make zip unzip openssl openssl-devel libxml2 libxml2-devel libxslt* zlib zlib-devel libjpeg-devel libpng-devel libwebp libwebp-devel freetype freetype-devel lsof pcre pcre-devel vixie-cron crontabs icu libicu-devel c-ares libffi-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel qrencode clang libaio ncurses-compat-libs" echo "下列软件将被安装:${yum_packs}" yum install -y --skip-broken ${yum_packs} for yum_pack in ${yum_packs} do rpm_pack=$(rpm -q ${yum_pack}) pack_check=$(echo ${rpm_pack}|grep not) if [ "${pack_check}" ]; then yum install ${yum_pack} -y fi done echo "安装必备软件:iptables" yum install -y iptables if [ -f "/usr/bin/dnf" ]; then dnf install -y redhat-rpm-config fi ali_os=$(cat /etc/redhat-release |grep "Alibaba Cloud Linux release 3") if [ -z "${ali_os}" ];then yum install epel-release -y fi } # 安装deb基础包 Install_Deb_Base_Pkg(){ # 如果apt存在锁,则手动删除释放锁文件 lf_pid=$(sudo lsof /var/lib/dpkg/lock-frontend | awk 'NR==2{print $2}') if [ -n "$lf_pid" ]; then sudo kill -9 $lf_pid fi l_pid=$(sudo lsof /var/lib/dpkg/lock | awk 'NR==2{print $2}') if [ -n "$l_pid" ]; then sudo kill -9 $l_pid fi ln -sf bash /bin/sh ubuntu_22=$(cat /etc/issue|grep "Ubuntu 22") if [ "${ubuntu_22}" ];then apt-get remove needrestart -y fi aliyun_check=$(cat /etc/motd|grep "Alibaba Cloud ") if [ "${aliyun_check}" ] && [ "${ubuntu_22}" ];then apt-get remove libicu70 -y fi apt-get update -y apt-get install bash -y if [ -f "/usr/bin/bash" ];then ln -sf /usr/bin/bash /bin/sh fi apt-get install ruby -y apt-get install lsb-release -y libcurl_ver=$(dpkg -l|grep libcurl4|awk '{print $3}') if [ "${libcurl_ver}" == "7.68.0-1ubuntu2.8" ];then apt-get remove libcurl4 -y apt-get install curl -y fi deb_packs="wget curl libcurl4-openssl-dev gcc make zip unzip tar openssl libssl-dev libxml2 libxml2-dev zlib1g zlib1g-dev libjpeg-dev libpng-dev lsof libpcre3 libpcre3-dev cron net-tools swig build-essential libffi-dev libbz2-dev libncurses-dev libsqlite3-dev iptables libreadline-dev tk-dev libgdbm-dev libdb-dev libdb++-dev libpcap-dev xz-utils git qrencode libwebp-dev libsodium-dev clang libaio1 libncurses5" echo "下列软件将被安装:${deb_packs}" apt-get install -y -m $deb_packs --force-yes for deb_pack in ${deb_packs} do pack_check=$(dpkg -l|grep ${deb_pack}) if [ "$?" -ne "0" ] ;then apt-get install -y $deb_pack fi done echo "安装必备软件:iptables" apt-get install -y iptables if [ ! -d '/etc/letsencrypt' ];then mkdir -p /etc/letsencryp mkdir -p /var/spool/cron if [ ! -f '/var/spool/cron/crontabs/root' ];then echo '' > /var/spool/cron/crontabs/root chmod 600 /var/spool/cron/crontabs/root fi fi } Init_DB(){ if [ ! -d "${SETUP_PATH}/db" ];then Red_Err "数据库文件缺失,请检查安装包" exit 1 fi if [ ! -f "${SETUP_PATH}/init/init.sql" ];then Red_Err "初始化数据文件缺失,请检查安装包" exit 1 fi chmod -R 0777 ${SETUP_PATH}/db time_now_str=$(date "+%Y-%m-%d %H:%M:%S") sed -i -e "s/{port}/${panel_port}/g" -e "s/{account}/${panel_user}/g" -e "s/{pwd}/${panel_pwd}/g" -e "s/{pwdMd5}/${panel_pwd_md5}/g" -e "s/{safeEntry}/${safe_entry}/g" -e "s/{time}/${time_now_str}/g" -e "s/{xpVersion}/${XP_VERSION}/g" -e "s/{idcCode}/${IDC_CODE}/g" ${SETUP_PATH}/init/init.sql msg=$(sqlite3 ${SETUP_PATH}/db/app.db < ${SETUP_PATH}/init/init.sql 2>&1) if [ $? -ne 0 ];then Red_Err "数据库初始化失败,错误信息:${msg}" exit 1 fi } Down_Deps(){ for pkg in $@ do dl_url="${DL_HOST}/deps/${pkg}.tar.gz" cd ${SETUP_PATH}/download wget -O ./${pkg}.tar.gz "${dl_url}" mkdir -p ./${pkg} tar -zxvf ./${pkg}.tar.gz -C ./${pkg} sudo bash ./${pkg}/${pkg}_install.sh cd $current_dir done } Check_CMD(){ for cmd in $@ do if ! command -v "$cmd" &> /dev/null; then Red_Err "Error: Command '$cmd' not found." exit 1 fi done } Down_XP(){ mkdir -p $SETUP_PATH/download wget -O ${SETUP_PATH}/download/xp-panel.tar.gz "${DL_HOST}/dl/xp/xp-panel.tar.gz" } Init_Tools(){ xp_tools_dir="/xp/tools" if [ -d "$xp_tools_dir" ]; then for tool in "$xp_tools_dir"/*.sh; do filename=$(basename "$tool" .sh) if [ -L "/usr/bin/$filename" ]; then rm "/usr/bin/$filename" fi ln -s "$tool" "/usr/bin/$filename" done fi } Init_XP(){ Check_CMD sqlite3 iptables vsftpd mkdir -p $SETUP_PATH/server mkdir -p $SETUP_PATH/panel mkdir -p $SETUP_PATH/wwwlogs mkdir -p $SETUP_PATH/applogs mkdir -p $SETUP_PATH/www mkdir -p $SETUP_PATH/backup mkdir -p $SETUP_PATH/db mkdir -p $SETUP_PATH/init cd $SETUP_PATH sudo tar -zxvf $SETUP_PATH/download/xp-panel.tar.gz -C $SETUP_PATH > /dev/null 2>&1 sudo chown -R root /xp/* sudo chmod -R 0777 /xp/* # 给程序执行权限 sudo chmod +x /xp/panel/app sudo chmod +x /xp/tasks/xp-tasks sudo chmod +x /xp/*.sh if [ ! -d "/etc/init.d" ];then mkdir -p /etc/init.d fi if [ -f "/etc/init.d/xpd" ]; then /etc/init.d/xpd stop sleep 1 fi # 添加一个www用户 run_user="www" www_user=$(cat /etc/passwd|cut -d ":" -f 1|grep ^www$) if [ "${www_user}" != "www" ];then groupadd ${run_user} useradd -s /sbin/nologin -g ${run_user} ${run_user} fi # 设置面板端口 panel_port="6860" # if [ "${PANEL_PORT}" ];then # # 检查端口是否被占用 # result=$(netstat -tln | grep ":${PANEL_PORT}") # if [ -n "$result" ]; then # Red_Err "安装面板失败,指定的端口 ${PANEL_PORT} 已被占用" # fi # panel_port=$PANEL_PORT # else # # 随机生成端口号 # panel_port=$(expr $RANDOM % 55535 + 10000) # # 检查端口是否被占用 # result=$(netstat -tln | grep ":$panel_port") # while [ -n "$result" ]; do # panel_port=$(expr $RANDOM % 55535 + 10000) # result=$(netstat -tln | grep ":$panel_port") # done # fi # 设置面板用户名 panel_user="1" if [ "$PANEL_USER" ];then panel_user="1" fi # 生成面板默认密码 panel_pwd="1" if [ "$PANEL_PWD" ];then panel_pwd="1" fi sleep 1 panel_pwd_md5=$(echo -n $panel_pwd | md5sum | cut -d ' ' -f 1) # 生成安全入口 if [ -z "$SAFE_ENTRY" ];then safe_entry="1" else safe_entry="1" fi # 安装xp服务 sudo cp ${SETUP_PATH}/init/xpd /etc/init.d/xpd sudo chmod +x /etc/init.d/xpd # 给xp脚本创建软连接 sudo chmod 777 /xp/xp.sh if [ -f "/usr/bin/xp" ];then sudo rm -f /usr/bin/xp fi sudo ln -s /xp/xp.sh /usr/bin/xp # 给tools目录下的脚本创建软连接 Init_Tools Init_DB # 配置vsftpd sudo touch /var/log/vsftpd.log sudo chmod 777 /var/log/vsftpd.log sudo touch /var/log/vsftpd_xfer.log sudo chmod 777 /var/log/vsftpd_xfer.log sudo setsid /usr/local/bin/vsftpd /etc/vsftpd.conf & } Get_IP_Info(){ IP_ADDR="" IP_ADDR=$(curl -sS --connect-timeout 10 -m 60 ${API_HOST}/api/myIP) LOCAL_IP=$(ip addr | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -E -v "^127\.|^255\.|^0\." | head -n 1) } Kill_Old_XP(){ sudo pkill -f /xp/panel/app sudo pkill -f /xp/tasks/xp-task } End(){ # # sudo bash $SETUP_PATH/run.sh # echo -e "\033[32m小皮面板启动中\033[0m" # Panel_Pid=$(ps -ef | grep /xp/panel/app | grep -v grep | awk '{print $2}') # Panel_Status="面板状态:未知" # if [ -n "${Panel_Pid}" ]; then # Panel_Status="\033[32m面板状态:运行中\033[0m" # else # Panel_Status="\033[31m面板状态:未运行\033[0m" # fi # Task_Pid=$(sudo ps -ef | grep /xp/tasks/xp-tasks | grep -v grep | awk '{print $2}') # Task_Status="面板状态:未知" # if [ -n "${Task_Pid}" ]; then # Task_Status="\033[32m队列状态:运行中\033[0m" # else # Task_Status="\033[31m队列状态:未运行\033[0m" # fi echo -e "================================================================" echo -e " \033[32m小皮面板安装成功\033[0m" echo -e "=========================面板状态===============================" echo -e " ${Panel_Status}" echo -e " ${Task_Status}" echo -e "=========================面板账户信息===========================" echo -e "" echo -e " 面板版本: ${XP_VERSION}" echo -e " 外网面板地址: ${HTTP_STR}://${IP_ADDR}:${panel_port}/${safe_entry}" echo -e " 内网面板地址: ${HTTP_STR}://${LOCAL_IP}:${panel_port}/${safe_entry}" echo -e " username: ${panel_user}" echo -e " password: ${panel_pwd}" echo -e "" echo -e "=========================面板注意事项===========================" echo -e "" echo -e " 【云服务器】请在安全组放行 $panel_port 端口" echo -e " 面板工具命令: xp" echo -e "" echo -e "================================================================" end_time=`date +%s` ((out_time=($end_time-$start_time))) echo -e "安装花费时间:\033[32m $out_time \033[0m秒" echo -e "安装日志路径:\033[32m $INSTALL_LOG_PATH \033[0m" echo -e "安装花费时间:\033[32m $out_time \033[0m秒" } Install_Tip(){ echo "+${STRIPE_LINE}${STRIPE_LINE}" echo "| xp-panel for CentOS/Ubuntu/Debian" echo "+${STRIPE_LINE}${STRIPE_LINE}" echo "| Copyright © 2015-2050 XP-SOFT(https://xp.cn) All rights reserved." echo "+${STRIPE_LINE}${STRIPE_LINE}" echo "| The WebPanel URL will be http://SERVER_IP:${PANEL_PORT} when installed." echo "+${STRIPE_LINE}${STRIPE_LINE}" echo "| 为了您的正常使用,请确保使用全新或纯净的系统安装小皮面板" echo "+${STRIPE_LINE}${STRIPE_LINE}" echo "| 安装后可能会影响您系统原有的防火墙、ftp、数据库、开发环境等" echo "+${STRIPE_LINE}${STRIPE_LINE}" echo "| 开始安装后将会停止系统正在运行的小皮面板,并覆盖之前面板的数据,请注意备份" echo "+${STRIPE_LINE}${STRIPE_LINE}" } Open_Log(){ touch $INSTALL_LOG_PATH exec 4>$INSTALL_LOG_PATH exec > >(tee >(cat >&4)) 2>&1 } Analysis_Log(){ exec 4>&- err_end=$(grep -n "请截图以上报错信息发给客服人员" $INSTALL_LOG_PATH | cut -d: -f1 | tail -n 1) if [ -n "$err_end" ]; then err_start=$(($err_end - 50)) if [ $err_start -lt 0 ]; then err_start=1 fi err=$(sed 's/\x1B\[[0-9;]*[JKmsu]//g' $INSTALL_LOG_PATH | sed -n "${err_start},${err_end}p" | tr '\n' ';') d='{"ver": "'${XP_VERSION}'", "err": "'${err}'","sysInfo": "'${SYS_INFO}'", "ip":"", "idc":"'${IDC_CODE}'"}' curl -s -X POST -H "Content-Type: application/json" -d "${d}" "${API_HOST}/api/installErr" 2>&1 >/dev/null fi err_end=$(grep -n "状态:未运行" $INSTALL_LOG_PATH | cut -d: -f1 | tail -n 1) if [ -n "$err_end" ]; then err_start=$(($err_end - 50)) if [ $err_start -lt 0 ]; then err_start=1 fi err=$(sed 's/\x1B\[[0-9;]*[JKmsu]//g' $INSTALL_LOG_PATH | sed -n "${err_start},${err_end}p" | tr '\n' ';') d='{"ver": "'${XP_VERSION}'", "err": "'${err}'","sysInfo": "'${SYS_INFO}'"}' curl -s -X POST -H "Content-Type: application/json" -d "${d}" "${API_HOST}/api/installErr" 2>&1 >/dev/null fi } Disable_Sudo_TTY(){ if [ -f "/etc/sudoers" ]; then tty_mode=$(grep '^Default.*requiretty' /etc/sudoers) if [ -n "$tty_mode" ]; then sed -i 's/^Default.*requiretty/#&/' /etc/sudoers fi fi } Select_DlNode(){ echo "select download node..." json_str=$(curl -s "${API_HOST}/api/dlNodes") if ! echo $json_str | grep -q '"ip":'; then echo "get download nodes failed, use default node" return fi ips=$(echo $json_str | grep -oP '"ip"\s*:\s*"\K[^"]+') min_delay_sec=5.0 fasted_ip="" for ip in $ips do delay_sec=$(timeout 5 curl -o /dev/null -s -w "%{time_total}" ${ip} || echo 999.0) comp_result=$(echo "${delay_sec} < ${min_delay_sec}" | awk '{print ($1 < $3) ? "1" : "0"}') if [ $comp_result -eq 1 ]; then min_delay_sec=$delay_sec fasted_ip=$ip fi done if [ -z "$fasted_ip" ]; then echo "test download nodes error, use default node" return fi if grep -q "dl.xp.cn" /etc/hosts; then sed -i "s/.*dl.xp.cn.*/${fasted_ip} dl.xp.cn/g" /etc/hosts else echo -e "\n${fasted_ip} dl.xp.cn\n" >> /etc/hosts fi echo "select fasted download node finish" } Set_Cent_Repo_Source() { distro=$(cat /etc/centos-release | awk '{print $1}') version=$(cat /etc/centos-release | awk '{print $4}' | cut -d '.' -f1) if [ "$distro" == "CentOS" ]; then echo "开始替换 CentOS 的源为阿里源..." if [ "$version" == "7" ]; then echo "正在替换为 CentOS 7 的阿里源..." sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo sudo yum clean all && sudo yum makecache echo "替换完成!" elif [ "$version" == "8" ]; then echo "正在替换为 CentOS 8 的阿里源..." sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo sudo yum clean all && sudo yum makecache echo "替换完成!" else echo "不支持替换阿里源的 CentOS 版本:$version" fi fi } Install_Main(){ Kill_Old_XP Env_Check Get_PM Auto_Swap_Mem Set_Cent_Repo_Source if [ "${PM}" = "yum" ]; then Install_RPM_Base_Pkg elif [ "${PM}" = "apt-get" ]; then Install_Deb_Base_Pkg fi Get_IP_Info Select_DlNode Down_XP Down_Deps sqlite3 vsftpd Open_Log Disable_Sudo_TTY Init_XP Add_Service End exit 0 Analysis_Log exit 0 } Install_Tip # go="wait" # 确认安装的等待 # while [ ${#} -gt 0 ]; do # case $1 in # -u|--user) # PANEL_USER=$2 # shift 1 # ;; # -p|--password) # PANEL_PWD=$2 # shift 1 # ;; # -P|--port) # PANEL_PORT=$2 # shift 1 # ;; # --safe-entry) # SAFE_ENTRY=$2 # shift 1 # ;; # --ssl-disable) # SSL_PL="disable" # ;; # -y) # go="y" # ;; # *) # IDC_CODE=$1 # ;; # esac # shift 1 # done # while [ "$go" != 'Y' ] && [ "$go" != 'y' ] && [ "$go" != 'n' ] && [ "$go" != '' ] # do # read -p "Do you want to install xp-panel to the $SETUP_PATH directory now?(Y/n): " go; # done # if [ "$go" == 'n' ];then # exit; # fi # Get_LocalInfo # d='{"hostname": "'${hostname_check}'", "cpu": "'${CPU_INFO}'", "memory": "'${MEM_TOTAL}'", "diskUsage": "'${DISK_USE}'", "sysInfo": "'${SYS_INFO}'", "os": "'${SYS_VERSION}'", "idc": "'${IDC_CODE}'"}' # curl -s -X POST -H "Content-Type: application/json" -d "${d}" "${API_HOST}/api/addInstallInfo" 2>&1 >/dev/null Install_Main echo -e "666666666666666666666666666666666666666666" exit 0 # 安装完成删除安装包 rm -f $SETUP_PATH/download/xp-panel.tar.gz