files/ Script/VPN/SBshell/Debian/menu.sh
zhao e0482b5fd4 添加 Script/VPN/SBshell/Debian/menu.sh
Signed-off-by: zhao <zhao@noreply.localhost>
2024-12-28 11:44:09 +08:00

229 lines
6.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#################################################
# 描述: Debian/Ubuntu/Armbian 官方sing-box 全自动脚本
# 版本: 1.2.5
# 作者: Youtube: 七尺宇
#################################################
# 定义颜色
CYAN='\033[0;36m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # 无颜色
# 脚本下载目录和初始化标志文件
SCRIPT_DIR="/etc/sing-box/scripts"
INITIALIZED_FILE="$SCRIPT_DIR/.initialized"
# 确保脚本目录存在并设置权限
sudo mkdir -p "$SCRIPT_DIR"
sudo chown "$(whoami)":"$(whoami)" "$SCRIPT_DIR"
# 脚本的URL基础路径
BASE_URL="https://raw.githubusercontent.com/qichiyuhub/sbshell/refs/heads/master/debian"
# 脚本列表
SCRIPTS=(
"check_environment.sh" # 检查系统环境
"set_network.sh" # 配置网络设置
"check_update.sh" # 检查可用更新
"install_singbox.sh" # 安装 Sing-box
"manual_input.sh" # 手动输入配置
"manual_update.sh" # 手动更新配置
"auto_update.sh" # 自动更新配置
"configure_tproxy.sh" # 配置 TProxy 模式
"configure_tun.sh" # 配置 TUN 模式
"start_singbox.sh" # 手动启动 Sing-box
"stop_singbox.sh" # 手动停止 Sing-box
"clean_nft.sh" # 清理 nftables 规则
"set_defaults.sh" # 设置默认配置
"commands.sh" # 常用命令
"switch_mode.sh" # 切换代理模式
"manage_autostart.sh" # 设置自启动
"check_config.sh" # 检查配置文件
"update_scripts.sh" # 更新脚本
"menu.sh" # 主菜单
)
# 下载并设置单个脚本,带重试和日志记录逻辑
download_script() {
local SCRIPT="$1"
local RETRIES=5 # 增加重试次数
local RETRY_DELAY=5
for ((i=1; i<=RETRIES; i++)); do
if wget -q -O "$SCRIPT_DIR/$SCRIPT" "$BASE_URL/$SCRIPT"; then
chmod +x "$SCRIPT_DIR/$SCRIPT"
return 0
else
echo -e "${YELLOW}下载 $SCRIPT 失败,重试 $i/${RETRIES}...${NC}"
sleep "$RETRY_DELAY"
fi
done
echo -e "${RED}下载 $SCRIPT 失败,请检查网络连接。${NC}"
return 1
}
# 并行下载脚本
parallel_download_scripts() {
local pids=()
for SCRIPT in "${SCRIPTS[@]}"; do
download_script "$SCRIPT" &
pids+=("$!")
done
for pid in "${pids[@]}"; do
wait "$pid"
done
}
# 检查脚本完整性并下载缺失的脚本
check_and_download_scripts() {
local missing_scripts=()
for SCRIPT in "${SCRIPTS[@]}"; do
if [ ! -f "$SCRIPT_DIR/$SCRIPT" ]; then
missing_scripts+=("$SCRIPT")
fi
done
if [ ${#missing_scripts[@]} -ne 0 ]; then
echo -e "${CYAN}正在下载脚本,请耐心等待...${NC}"
for SCRIPT in "${missing_scripts[@]}"; do
download_script "$SCRIPT" || {
echo -e "${RED}下载 $SCRIPT 失败,是否重试?(y/n): ${NC}"
read -r retry_choice
if [[ "$retry_choice" =~ ^[Yy]$ ]]; then
download_script "$SCRIPT"
else
echo -e "${RED}跳过 $SCRIPT 下载。${NC}"
fi
}
done
fi
}
# 初始化操作
initialize() {
# 检查是否存在旧脚本
if ls "$SCRIPT_DIR"/*.sh 1> /dev/null 2>&1; then
find "$SCRIPT_DIR" -type f -name "*.sh" ! -name "menu.sh" -exec rm -f {} \;
rm -f "$INITIALIZED_FILE"
fi
# 重新下载脚本
parallel_download_scripts
# 进行首次运行的其他初始化操作
auto_setup
touch "$INITIALIZED_FILE"
}
# 自动引导设置
auto_setup() {
systemctl is-active --quiet sing-box && sudo systemctl stop sing-box
bash "$SCRIPT_DIR/check_environment.sh"
command -v sing-box &> /dev/null || bash "$SCRIPT_DIR/install_singbox.sh" || bash "$SCRIPT_DIR/check_update.sh"
bash "$SCRIPT_DIR/switch_mode.sh"
bash "$SCRIPT_DIR/manual_input.sh"
bash "$SCRIPT_DIR/start_singbox.sh"
}
# 检查是否需要初始化
if [ ! -f "$INITIALIZED_FILE" ]; then
echo -e "${CYAN}进入初始化引导设置,回车继续输入skip跳过${NC}"
read -r init_choice
if [[ "$init_choice" =~ ^[Ss]kip$ ]]; then
echo -e "${CYAN}跳过初始化引导,直接进入菜单...${NC}"
else
initialize
fi
fi
# 添加别名到 .bashrc如果已存在则不再添加
if ! grep -q "alias sb=" ~/.bashrc; then
echo "alias sb='bash $SCRIPT_DIR/menu.sh menu'" >> ~/.bashrc
fi
# 创建快捷脚本
if [ ! -f /usr/local/bin/sb ]; then
echo -e '#!/bin/bash\nbash /etc/sing-box/scripts/menu.sh menu' | sudo tee /usr/local/bin/sb >/dev/null
sudo chmod +x /usr/local/bin/sb
fi
# 菜单显示
show_menu() {
echo -e "${CYAN}=========== Sbshell 管理菜单 ===========${NC}"
echo -e "${GREEN}1. Tproxy/Tun模式切换${NC}"
echo -e "${GREEN}2. 手动更新配置文件${NC}"
echo -e "${GREEN}3. 自动更新配置文件${NC}"
echo -e "${GREEN}4. 手动启动 sing-box${NC}"
echo -e "${GREEN}5. 手动停止 sing-box${NC}"
echo -e "${GREEN}6. 安装/更新 sing-box${NC}"
echo -e "${GREEN}7. 默认参数设置${NC}"
echo -e "${GREEN}8. 设置自启动${NC}"
echo -e "${GREEN}9. 网络设置(只支持debian)${NC}"
echo -e "${GREEN}10. 常用命令${NC}"
echo -e "${GREEN}11. 更新脚本${NC}"
echo -e "${GREEN}0. 退出${NC}"
echo -e "${CYAN}=======================================${NC}"
}
# 处理用户选择
handle_choice() {
read -rp "请选择操作: " choice
case $choice in
1)
bash "$SCRIPT_DIR/switch_mode.sh"
bash "$SCRIPT_DIR/manual_input.sh"
bash "$SCRIPT_DIR/start_singbox.sh"
;;
2)
bash "$SCRIPT_DIR/manual_update.sh"
;;
3)
bash "$SCRIPT_DIR/auto_update.sh"
;;
4)
bash "$SCRIPT_DIR/start_singbox.sh"
;;
5)
bash "$SCRIPT_DIR/stop_singbox.sh"
;;
6)
if command -v sing-box &> /dev/null; then
bash "$SCRIPT_DIR/check_update.sh"
else
bash "$SCRIPT_DIR/install_singbox.sh"
fi
;;
7)
bash "$SCRIPT_DIR/set_defaults.sh"
;;
8)
bash "$SCRIPT_DIR/manage_autostart.sh"
;;
9)
bash "$SCRIPT_DIR/set_network.sh"
;;
10)
bash "$SCRIPT_DIR/commands.sh"
;;
11)
bash "$SCRIPT_DIR/update_scripts.sh"
;;
0)
exit 0
;;
*)
echo -e "${RED}无效的选择${NC}"
;;
esac
}
# 主循环
while true; do
show_menu
handle_choice
done