144 lines
3.5 KiB
Bash
144 lines
3.5 KiB
Bash
#!/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..."
|
|
sleep 1
|
|
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
|
|
}
|
|
|
|
# 生成密码
|
|
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
|
|
|
|
}
|
|
|
|
# 重启docker容器
|
|
restart_docker() {
|
|
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../" # 脚本文件夹绝对路径
|
|
local compose_file="$script_dir/../docker-compose.yml"
|
|
|
|
# 如果容器未运行,提示启动
|
|
local running_count=$(docker compose -f $compose_file ps -q | wc -l)
|
|
if [ "$running_count" -eq 0 ]; then
|
|
read -p "容器未启动,是否启动容器?(y/n): " choice
|
|
case "$choice" in
|
|
Y|y)
|
|
docker compose -f $compose_file up -d
|
|
return
|
|
;;
|
|
*)
|
|
echo "已取消启动"
|
|
return
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
echo "正在重启容器..."
|
|
docker compose -f $compose_file down
|
|
docker compose -f $compose_file up -d
|
|
}
|
|
|
|
# 展示当前值并询问用户新输入的值
|
|
# 用法: ask_update "提示语" "当前值(当前配置文件的值)"
|
|
# 示例:
|
|
# new_port=$(ask_update "请输入新的端口号" "$(jq -r '.inbounds[0].port' $config_dir/config.json)")
|
|
ask_update() {
|
|
local prompt="$1" # 提示语
|
|
local current_value="$2"
|
|
local input
|
|
|
|
read -p "${prompt} [当前: ${current_value}]: " input
|
|
# 用户直接回车则保留当前值,否则使用新输入
|
|
echo "${input:-$current_value}"
|
|
}
|