#!/bin/bash red(){ echo -e "\033[31m$1\033[0m" } green(){ echo -e "\033[32m$1\033[0m" } # 动态安装软件包 install_package() { local package_name=$1 if command -v "$package_name" &> /dev/null; then echo "$package_name 已安装, 跳过." return 0 fi echo "安装 $package_name..." package_manager=$(get_package_manager) if [ "$package_manager" == "apt-get" ]; then sudo apt-get update sudo apt-get install -y "$package_name" elif [ "$package_manager" == "yum" ]; then sudo yum install -y "$package_name" else echo "未知的包管理器, 请手动安装 $package_name." return 1 fi } # 获取系统包管理器 get_package_manager(){ if command -v apt-get &> /dev/null; then echo "apt-get" elif command -v yum &> /dev/null; then echo "yum" else echo "未知的系统包管理器" return 1 # 返回错误状态码 fi } # 检查 jq 是否已安装 check_jq() { if command -v jq >/dev/null 2>&1; then return 0 else echo "jq 未安装" return 1 fi } # 检查 Docker 是否已安装 check_docker() { if command -v docker >/dev/null 2>&1; then return 0 else echo "Docker 未安装" return 1 fi } # 检查 docker-compose 是否已安装 check_docker_compose() { if command -v docker-compose >/dev/null 2>&1; then return 0 elif docker compose version >/dev/null 2>&1; then ## Docker 内置 compose 已安装 return 0 else echo "docker-compose 未安装" return 1 fi } # 安装docker install_docker(){ echo 安装docker... curl -fsSL https://get.docker.com | bash -s docker } # 安装docker-compose install_docker_compose(){ echo 安装docker-compose... wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.29.0/docker-compose-linux-x86_64 chmod +x /usr/local/bin/docker-compose } # 生成密码 gen_password() { local pass_length=$1 # 密码长度作为第一个参数 local chars='[:alnum:]' # 只允许出现字母和数字 local rand rand=$(< /dev/urandom tr -dc "$chars" | head -c "$pass_length") echo "$rand" } # URL编码 url_encode() { local str="$1" local encoded="" local i char hex for ((i = 0; i < ${#str}; i++)); do char="${str:$i:1}" case "$char" in [a-zA-Z0-9.~_-]) encoded+="$char" ;; *) printf -v hex '%02X' "'$char" encoded+="%$hex" ;; esac done echo "$encoded" } # 检查tuic配置文件 check_config_file(){ local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../" # 脚本文件夹绝对路径 local config_file="$script_dir/../config/config.json" # 检查配置文件是否存在 if [ ! -e "$config_file" ]; then echo "配置文件不存在, 请先生成配置文件." exit 1 fi # 检查配置文件是否为有效的JSON格式 if ! jq '.' "$config_file" >/dev/null 2>&1; then echo "配置文件不是有效的JSON格式, 请重新生成配置文件." exit 1 fi } restart_docker() { local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../" # 脚本文件夹绝对路径 # 如果容器未运行,提示启动 local running_count=$(docker-compose -f $script_dir/../docker-compose.yml ps -q | wc -l) if [ "$running_count" -eq 0 ]; then read -p "容器未启动,是否启动容器?(y/n): " choice case "$choice" in Y|y) docker-compose -f $script_dir/../docker-compose.yml up -d return ;; *) echo "已取消启动" return ;; esac fi echo "正在重启容器..." docker-compose -f $script_dir/../docker-compose.yml down docker-compose -f $script_dir/../docker-compose.yml up -d }