229 lines
6.8 KiB
Bash
229 lines
6.8 KiB
Bash
#!/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 |