添加 Script/VPN/SBshell/Debian/menu.sh

Signed-off-by: zhao <zhao@noreply.localhost>
This commit is contained in:
zhao 2024-12-28 11:44:09 +08:00
parent 4389838a25
commit e0482b5fd4

View File

@ -0,0 +1,229 @@
#!/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