上传文件至 /

This commit is contained in:
2025-11-29 18:19:54 +08:00
parent 7cdaf09313
commit 98382c61eb
2 changed files with 333 additions and 0 deletions

330
init-debian.sh Normal file
View File

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