Files
debian/init-debian.sh
2025-12-06 22:21:12 +08:00

332 lines
9.6 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
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查是否为 root
if [[ $EUID -ne 0 ]]; then
log_error "此脚本必须以 root 权限运行"
exit 1
fi
# 提示输入 kairee 用户密码
echo "========================================"
echo "Debian 系统初始化脚本"
echo "========================================"
echo
echo "请输入要为用户 'kairee' 设置的密码:"
read -s -p "密码: " USER_PASSWORD
echo
read -s -p "确认密码: " USER_PASSWORD_CONFIRM
echo
# 验证密码
if [ -z "$USER_PASSWORD" ]; then
log_error "密码不能为空"
exit 1
fi
if [ "$USER_PASSWORD" != "$USER_PASSWORD_CONFIRM" ]; then
log_error "两次输入的密码不匹配"
exit 1
fi
log_success "密码验证通过"
echo
# 1. 创建用户 kairee
log_info "创建用户 'kairee'..."
if id "kairee" &>/dev/null; then
log_warning "用户 'kairee' 已存在,跳过创建"
else
# 创建 /data/home 目录
mkdir -p /data/home
# 创建用户,指定家目录为 /data/home/kairee
useradd -m -d /data/home/kairee -s /bin/bash -u 1000 -U kairee
echo "kairee:$USER_PASSWORD" | chpasswd
log_success "用户 'kairee' 创建成功 (uid=1000, 家目录: /data/home/kairee)"
fi
# 2. 下载并解压数据包
log_info "从远程下载 data 压缩包..."
# 这里需要指定实际的下载 URL
# TODO: 请替换为实际的下载地址
DATA_URL="https://example.com/path/to/data.tar.gz"
# 检查是否有 URL 参数
if [ -n "$1" ]; then
DATA_URL="$1"
log_info "使用提供的 URL: $DATA_URL"
fi
if [ "$DATA_URL" = "https://example.com/path/to/data.tar.gz" ]; then
log_warning "未设置 DATA_URL跳过下载步骤"
log_warning "你可以手动将 data 目录复制到 /data"
else
# 创建临时文件
TEMP_FILE=$(mktemp)
# 下载
log_info "正在下载..."
if ! curl -L -o "$TEMP_FILE" "$DATA_URL"; then
log_error "下载失败"
rm -f "$TEMP_FILE"
exit 1
fi
# 解压到 /data
log_info "解压到 /data..."
mkdir -p /data
if ! tar -xzf "$TEMP_FILE" -C /; then
log_error "解压失败"
rm -f "$TEMP_FILE"
exit 1
fi
# 清理
rm -f "$TEMP_FILE"
log_success "数据包下载并解压完成"
fi
# 3. 安装软件包
log_info "更新 apt 并安装软件包..."
apt-get update
apt-get install -y sudo vim rsync curl sshpass
apt-get reinstall -y openssl openssh-server
log_success "基础软件包安装完成"
# 4. 安装 Docker
log_info "安装 Docker CE..."
if command -v docker &> /dev/null; then
log_warning "Docker 已安装,跳过安装步骤"
else
curl -Lo- https://get.docker.com | bash
log_success "Docker CE 安装完成"
fi
# 5. 配置 apt 源
log_info "配置 apt 源..."
if [ -d /data/etc/apt/sources.list.d ]; then
# 备份旧的源
if [ -f /etc/apt/sources.list ]; then
mv /etc/apt/sources.list /etc/apt/sources.list.bak
log_info "备份 /etc/apt/sources.list -> /etc/apt/sources.list.bak"
fi
if [ -f /etc/apt/sources.list.d/docker.list ]; then
mv /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.list.bak
log_info "备份 /etc/apt/sources.list.d/docker.list -> docker.list.bak"
fi
# 创建目录
mkdir -p /etc/apt/sources.list.d
# 创建软链接
for src_file in /data/etc/apt/sources.list.d/*; do
if [ -f "$src_file" ]; then
filename=$(basename "$src_file")
target_file="/etc/apt/sources.list.d/$filename"
if [ -L "$target_file" ]; then
rm -f "$target_file"
fi
ln -s "$src_file" "$target_file"
log_success "创建软链接: $src_file -> $target_file"
fi
done
else
log_warning "未找到 /data/etc/apt/sources.list.d 目录,跳过 apt 源配置"
fi
# 6. 配置 Docker daemon
log_info "配置 Docker daemon..."
if [ -f /data/etc/docker/daemon.json ]; then
mkdir -p /etc/docker
if [ -f /etc/docker/daemon.json ]; then
cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
log_info "备份 /etc/docker/daemon.json -> daemon.json.bak"
fi
ln -sf /data/etc/docker/daemon.json /etc/docker/daemon.json
log_success "创建 Docker daemon 配置软链接"
else
log_warning "未找到 /data/etc/docker/daemon.json跳过 Docker 配置"
fi
# 7. 配置 SSH
log_info "配置 SSH..."
if [ -f /data/etc/ssh/sshd_config ]; then
if [ -f /etc/ssh/sshd_config ]; then
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
log_info "备份 /etc/ssh/sshd_config -> sshd_config.bak"
fi
ln -sf /data/etc/ssh/sshd_config /etc/ssh/sshd_config
log_success "创建 SSH 配置软链接"
# 重启 ssh 服务
systemctl restart sshd || systemctl restart ssh
log_success "SSH 服务已重启"
else
log_warning "未找到 /data/etc/ssh/sshd_config跳过 SSH 配置"
fi
# 8. 配置 sudoers
echo "kairee ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/kairee
chmod 0440 /etc/sudoers.d/kairee
log_success "创建 /etc/sudoers.d/kairee"
# 9. 添加 kairee 到 docker 组
if getent group docker > /dev/null; then
usermod -aG docker kairee
log_success "已将 kairee 添加到 docker 组"
else
log_warning "docker 组不存在,请检查 Docker 是否正确安装"
fi
# 10. 创建家目录软链接
log_info "配置家目录..."
if [ -d /data/home/kairee ]; then
# 如果 /home/kairee 已存在但不是软链接,则删除
if [ -e "/home/kairee" ] && [ ! -L "/home/kairee" ]; then
log_warning "/home/kairee 已存在但不是软链接,将被删除并重新创建"
rm -rf /home/kairee
fi
# 如果 /home/kairee 是软链接但指向错误的位置,也删除
if [ -L "/home/kairee" ] && [ "$(readlink /home/kairee)" != "/data/home/kairee" ]; then
log_warning "/home/kairee 软链接指向错误的位置,将被重新创建"
rm -f /home/kairee
fi
# 创建软链接
if [ ! -e "/home/kairee" ]; then
ln -s /data/home/kairee /home/kairee
log_success "创建家目录软链接: /data/home/kairee -> /home/kairee"
else
log_success "家目录软链接已存在且正确"
fi
else
log_warning "未找到 /data/home/kairee无法创建软链接"
fi
# 11. 生成 SSH 密钥对
log_info "生成 SSH 密钥对..."
SSH_KEY_DIR="/root/.ssh"
SSH_PRIVATE_KEY="$SSH_KEY_DIR/id_ed25519"
SSH_PUBLIC_KEY="$SSH_KEY_DIR/id_ed25519.pub"
mkdir -p "$SSH_KEY_DIR"
chmod 700 "$SSH_KEY_DIR"
if [ -f "$SSH_PRIVATE_KEY" ]; then
log_warning "SSH 私钥已存在,跳过生成: $SSH_PRIVATE_KEY"
else
# 生成 ed25519 密钥对
ssh-keygen -m PEM -t ed25519 -f "$SSH_PRIVATE_KEY" -N ""
log_success "生成 SSH 密钥对完成"
log_info "私钥: $SSH_PRIVATE_KEY"
log_info "公钥: $SSH_PUBLIC_KEY"
fi
# 12. 复制公钥到远程服务器
log_info "复制公钥到远程服务器..."
REMOTE_HOST="qc5.ofcdn.cn"
REMOTE_PORT="46571"
REMOTE_USER="kairee"
REMOTE_SSH_COPY_ID_USER="kairee"
# 检查公钥是否存在
if [ ! -f "$SSH_PUBLIC_KEY" ]; then
log_error "公钥文件不存在: $SSH_PUBLIC_KEY"
log_error "无法执行 ssh-copy-id"
else
# 提示用户输入远程 SSH 密码
echo
echo "========================================"
echo "输入远程服务器 SSH 密码"
echo "========================================"
echo "目标: $REMOTE_SSH_COPY_ID_USER@${REMOTE_HOST}:${REMOTE_PORT}"
echo
echo "请输入 $REMOTE_SSH_COPY_ID_USER$REMOTE_HOST 上的 SSH 密码:"
read -s -p "SSH 密码: " REMOTE_SSH_PASSWORD
echo
if [ -z "$REMOTE_SSH_PASSWORD" ]; then
log_warning "未输入 SSH 密码,跳过 ssh-copy-id"
else
# 使用 sshpass 执行 ssh-copy-id
log_info "使用 sshpass 执行 ssh-copy-id..."
sshpass -p "$REMOTE_SSH_PASSWORD" ssh-copy-id -p "$REMOTE_PORT" "$REMOTE_SSH_COPY_ID_USER@$REMOTE_HOST"
log_success "公钥已复制到远程服务器"
fi
fi
# 13. 添加定时任务
log_info "配置定时任务..."
if [ -f /data/scripts/certs.sh ]; then
# 创建日志目录
mkdir -p /data/certs
# 生成随机时间1点到7点之间
RANDOM_HOUR=$((1 + RANDOM % 7))
RANDOM_MINUTE=$((RANDOM % 60))
# 创建 crontab 条目
CRON_CMD="$RANDOM_MINUTE $RANDOM_HOUR * * * /data/scripts/certs.sh >> /data/certs/sync.log 2>&1"
# 将定时任务添加到 root 用户的 crontab
(crontab -l 2>/dev/null; echo "$CRON_CMD") | crontab -
log_success "定时任务已添加"
log_info "执行时间: 每天 $RANDOM_HOUR:$RANDOM_MINUTE"
log_info "命令: /data/scripts/certs.sh >> /data/certs/sync.log 2>&1"
else
log_warning "未找到 /data/scripts/certs.sh跳过定时任务配置"
fi
echo
echo "========================================"
echo -e "${GREEN}初始化完成!${NC}"
echo "========================================"
echo
echo "重要提示:"
echo "1. 请重新登录或执行 'su - kairee' 以使 Docker 组权限生效"
echo "2. 如果下载了数据包,请检查 /data 目录内容是否正确"
echo "3. SSH 配置已更新,请测试远程连接是否正常"
echo "4. 可以使用 'sudo -u kairee -i' 切换到 kairee 用户"
echo "5. SSH 密钥已生成: /root/.ssh/id_ed25519"
echo "6. 定时任务: 每天 $RANDOM_HOUR:$RANDOM_MINUTE 执行 certs.sh"
echo
# 清理密码变量
unset USER_PASSWORD
unset USER_PASSWORD_CONFIRM
unset REMOTE_SSH_PASSWORD