#!/bin/bash # Unbound DNS 工具箱一键部署脚本 # 使用方法: sudo bash install-dns-toolkit.sh set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 检查 root 权限 if [ "$EUID" -ne 0 ]; then echo -e "${RED}请以 root 用户执行此脚本${NC}" exit 1 fi echo -e "${GREEN}开始部署 Unbound DNS 工具箱...${NC}" # 定义目标目录和仓库地址 TARGET_DIR="/etc/dns" REPO_URL="https://github.com/xiaonaifei/ubound-dns-one-click-installation-script.git" # 如果目标目录已存在,询问是否覆盖 if [ -d "$TARGET_DIR" ]; then echo -e "${YELLOW}目录 $TARGET_DIR 已存在。${NC}" read -p "是否删除并重新克隆?(y/n): " confirm if [[ "$confirm" =~ ^[yY](es)?$ ]]; then rm -rf "$TARGET_DIR" echo "已删除 $TARGET_DIR" else echo "部署取消。" exit 0 fi fi # 克隆仓库 echo -e "${GREEN}克隆仓库到 $TARGET_DIR ...${NC}" git clone "$REPO_URL" "$TARGET_DIR" # 检查克隆是否成功 if [ $? -ne 0 ]; then echo -e "${RED}克隆失败,请检查网络或仓库地址。${NC}" exit 1 fi # 创建整合脚本 dns-toolkit.sh(内嵌完整代码) echo -e "${GREEN}创建整合脚本 dns-toolkit.sh ...${NC}" cat > "$TARGET_DIR/dns-toolkit.sh" <<'EOF' #!/bin/bash # Unbound DNS 服务器一键管理工具箱 # 仓库: https://github.com/xiaonaifei/ubound-dns-one-click-installation-script # 功能整合: kill-53, dns-Unbound, bbr-update, bbr-core-update, # CloudflareSpeedTest-Install.sh, Chinese-font-installation.sh, # 以及附加的中文语言环境设置和内核优化 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 检查 root 权限 check_root() { if [ "$EUID" -ne 0 ]; then echo -e "${RED}请以 root 用户执行此脚本${NC}" exit 1 fi } # 获取脚本所在目录的绝对路径(仓库根目录) SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" # 显示主菜单 show_menu() { clear echo -e "${BLUE}══════════════════════════════════════════════${NC}" echo -e "${GREEN} Unbound DNS 服务器一键管理工具箱 ${NC}" echo -e "${BLUE}══════════════════════════════════════════════${NC}" echo -e "${YELLOW} 脚本仓库: ${SCRIPT_DIR}${NC}" echo "" echo " 1) 清理 53 端口占用 (kill-53)" echo " 2) 安装/配置 Unbound DNS 服务器 (dns-Unbound)" echo " 3) 更新 BBR 内核 (bbr-core-update)" echo " 4) 调整 BBR 参数 (bbr-update)" echo " 5) 安装 Cloudflare 速度测试工具 (CloudflareSpeedTest-Install.sh)" echo " 6) 安装中文字体/语言包 (Chinese-font-installation.sh)" echo " 7) 设置系统中文语言环境 (locale 配置)" echo " 8) 应用系统内核优化参数 (sysctl 调优)" echo " 9) 查看当前系统状态 (端口、内核、语言)" echo "10) 一键执行推荐设置 (DNS + BBR内核 + 优化)" echo " 0) 退出" echo -e "${BLUE}══════════════════════════════════════════════${NC}" echo -n "请输入选项 [0-10]: " } # 执行子脚本,处理文件存在性与权限 run_script() { local script_name="$1" local script_path="${SCRIPT_DIR}/${script_name}" if [ ! -f "$script_path" ]; then echo -e "${RED}错误: 未找到脚本 ${script_name}${NC}" echo -e "请确保文件存在于仓库目录: ${SCRIPT_DIR}" read -p "按 Enter 键返回菜单..." return 1 fi if [ ! -x "$script_path" ]; then echo -e "${YELLOW}脚本 ${script_name} 缺少执行权限,正在添加...${NC}" chmod +x "$script_path" fi echo -e "${GREEN}正在执行: ${script_name} ...${NC}" "$script_path" local exit_code=$? if [ $exit_code -eq 0 ]; then echo -e "${GREEN}✅ ${script_name} 执行完成。${NC}" else echo -e "${RED}❌ ${script_name} 执行失败,退出码: ${exit_code}${NC}" fi echo "" read -p "按 Enter 键返回菜单..." } # 设置中文语言环境 setup_chinese_locale() { echo -e "${YELLOW}正在配置系统中文语言环境...${NC}" if [ -f /etc/os-release ]; then . /etc/os-release OS=$ID else echo -e "${RED}无法识别操作系统${NC}" return 1 fi case $OS in ubuntu|debian) apt update apt install -y language-pack-zh-hans locale-gen zh_CN.UTF-8 echo "LANG=zh_CN.UTF-8" > /etc/default/locale echo "LANGUAGE=zh_CN:zh" >> /etc/default/locale echo "LC_ALL=zh_CN.UTF-8" >> /etc/default/locale ;; centos|rhel|rocky|almalinux|fedora) if command -v dnf &> /dev/null; then dnf install -y glibc-langpack-zh else yum install -y glibc-langpack-zh fi localectl set-locale LANG=zh_CN.UTF-8 ;; *) echo -e "${RED}不支持的操作系统: $OS${NC}" return 1 ;; esac echo -e "${GREEN}中文语言环境配置完成,请重新登录或重启系统生效。${NC}" read -p "按 Enter 键返回菜单..." } # 应用 sysctl 优化 apply_sysctl_optimizations() { echo -e "${YELLOW}即将应用系统内核参数优化...${NC}" local bk_file="/etc/sysctl.conf.bk_$(date +%Y%m%d_%H%M%S)" cp /etc/sysctl.conf "$bk_file" echo -e "已备份原配置至: ${bk_file}" cat >> /etc/sysctl.conf </dev/null || echo "未配置" echo -e "\n${YELLOW}4. 当前语言环境:${NC}" locale | grep LANG echo -e "\n${YELLOW}5. 系统发行版:${NC}" cat /etc/os-release | grep -E "^(NAME|VERSION)=" || echo "未知" echo -e "${BLUE}══════════════════════════════════════════════${NC}" read -p "按 Enter 键返回菜单..." } # 一键执行推荐设置 onekey_install() { echo -e "${YELLOW}即将执行一键推荐安装/配置...${NC}" echo -e "包含: 清理53端口 + 安装Unbound + 更新BBR内核 + 应用优化" echo -e "${RED}此操作可能需要较长时间,请谨慎!${NC}" read -p "确认继续? (y/n): " confirm if [[ ! "$confirm" =~ ^[yY](es)?$ ]]; then echo "已取消。" read -p "按 Enter 键返回菜单..." return fi run_script "kill-53" run_script "dns-Unbound" if [ -f "${SCRIPT_DIR}/bbr-core-update" ]; then run_script "bbr-core-update" else echo -e "${YELLOW}未找到 bbr-core-update,尝试 bbr-update...${NC}" run_script "bbr-update" fi apply_sysctl_optimizations echo -e "${GREEN}一键推荐安装流程执行完毕。${NC}" read -p "按 Enter 键返回菜单..." } # 主循环 check_root while true; do show_menu read choice case $choice in 1) run_script "kill-53" ;; 2) run_script "dns-Unbound" ;; 3) run_script "bbr-core-update" ;; 4) run_script "bbr-update" ;; 5) run_script "CloudflareSpeedTest-Install.sh" ;; 6) run_script "Chinese-font-installation.sh" ;; 7) setup_chinese_locale ;; 8) apply_sysctl_optimizations ;; 9) show_system_status ;; 10) onekey_install ;; 0) echo -e "${GREEN}感谢使用,再见!${NC}" exit 0 ;; *) echo -e "${RED}无效选项,请重新输入。${NC}" read -p "按 Enter 键继续..." ;; esac done EOF # 赋予执行权限 chmod +x "$TARGET_DIR/dns-toolkit.sh" # 创建快捷命令 tcp(软链接) ln -sf "$TARGET_DIR/dns-toolkit.sh" /usr/local/bin/tcp echo -e "${GREEN}已创建快捷命令: tcp (可用 'sudo tcp' 运行)${NC}" # 提示完成 echo -e "${GREEN}✅ Unbound DNS 工具箱部署完成!${NC}" echo -e "你可以通过以下命令启动工具箱:" echo -e " ${YELLOW}sudo tcp${NC}" echo -e "" echo -e "脚本目录: ${TARGET_DIR}" echo -e "如需更新,请进入该目录执行 'git pull'。" exit 0