From 6468c298da682ebc1c25b15c7e1d58324840cdbb Mon Sep 17 00:00:00 2001 From: 3344 Date: Sun, 25 Jan 2026 14:21:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=2003?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 03 | 237 ++++++++++++++++++++++++++----------------------------------- 1 file changed, 100 insertions(+), 137 deletions(-) diff --git a/03 b/03 index ffcdb0a..a7b69da 100644 --- a/03 +++ b/03 @@ -1,125 +1,99 @@ #!/bin/bash -# ================= 核心配置区域 ================= -# 1. 设置版本号 (修改此处即可控制下载版本) +# ================= 配置区域 ================= VERSION="1.1.15" - -# 2. 官方标准数据目录 (不要改动,这是 RustDesk 的默认位置) DATA_DIR="/var/lib/rustdesk-server" +BACKUP_DIR="/tmp/rustdesk_backup_$(date +%s)" +# =========================================== -# 3. 下载链接 (自动适配上方版本号) -# 主源:你的私有源 -URL_HBBS_PRIMARY="https://cloudreve.vps3344521.xyz/f/W9tx/rustdesk-server-hbbs_${VERSION}_amd64.deb" -URL_HBBR_PRIMARY="https://cloudreve.vps3344521.xyz/f/j3fJ/rustdesk-server-hbbr_${VERSION}_amd64.deb" -# 备用源:GitHub (防止私有源挂掉) -URL_HBBS_FALLBACK="https://github.com/rustdesk/rustdesk-server/releases/download/${VERSION}/rustdesk-server-hbbs_${VERSION}_amd64.deb" -URL_HBBR_FALLBACK="https://github.com/rustdesk/rustdesk-server/releases/download/${VERSION}/rustdesk-server-hbbr_${VERSION}_amd64.deb" -# =============================================== +echo "========================================================" +echo " RustDesk Server 全能修复脚本 (安装/转移/修复/启动)" +echo "========================================================" -# --- 功能: 检测安装并询问是否卸载重装 --- -echo "正在检查系统状态..." +# --- 1. 智能查找并备份/转移现有的密钥 --- +echo ">>> [1/7] 正在扫描并搜集现有的密钥文件..." +mkdir -p "$BACKUP_DIR" -if systemctl list-unit-files | grep -q "rustdesk-hbbs.service"; then - echo "------------------------------------------------" - echo "⚠️ 检测到系统已安装 RustDesk Server!" - echo "------------------------------------------------" - read -p "是否卸载当前版本并重新安装?(输入 y 确认重装,输入 n 退出): " choice - case "$choice" in - y|Y ) - echo ">>> 正在停止服务..." - systemctl stop rustdesk-hbbs rustdesk-hbbr - systemctl disable rustdesk-hbbs rustdesk-hbbr - - echo ">>> 正在卸载程序..." - dpkg -P rustdesk-server-hbbs rustdesk-server-hbbr - apt-get purge -y rustdesk-server-hbbs rustdesk-server-hbbr - - # 询问是否清空数据 - echo "------------------------------------------------" - echo "注意:官方数据目录为 $DATA_DIR" - read -p "是否清空旧的 Key 和数据库?(y/n) [推荐 y 以防冲突]: " del_data - if [[ "$del_data" == "y" || "$del_data" == "Y" ]]; then - rm -rf "$DATA_DIR" - echo ">>> 旧数据已清除。" - else - echo ">>> 旧数据已保留。" - fi - echo ">>> 卸载完成,准备重新安装..." - sleep 2 - ;; - * ) - echo ">>> 操作已取消,脚本退出。" - exit 0 - ;; - esac -fi - -# ================== 安装流程 ================== - -# 1. 基础环境修复与依赖安装 -echo ">>> [1/6] 正在配置基础环境..." -apt-get update -q -# 增加 ufw 用于防火墙管理,dnsutils 用于网络查询 -apt-get install -y curl wget lsof ufw dnsutils - -# 2. 智能获取公网 IP (双重保险) -echo ">>> [2/6] 正在获取公网 IP..." -HOST_IP=$(curl -s4 --connect-timeout 5 ifconfig.me) -if [ -z "$HOST_IP" ]; then - echo " 备用方案启动:尝试通过 ip.sb 获取..." - HOST_IP=$(curl -s4 --connect-timeout 5 ip.sb) -fi - -if [ -z "$HOST_IP" ]; then - echo "❌ 错误:无法获取公网 IP,请检查网络连接。" - exit 1 -fi -echo " 获取成功: $HOST_IP" - -# 3. 下载安装包 (自动重试) -echo ">>> [3/6] 正在下载安装包 (版本: $VERSION)..." - -# 下载函数 -download_pkg() { - local name=$1 - local url_pri=$2 - local url_sec=$3 - - echo " 正在下载 $name..." - wget -O "$name.deb" "$url_pri" - - # 检查文件是否有效(大于 1KB) - if [ ! -s "$name.deb" ] || [ $(stat -c%s "$name.deb") -lt 1000 ]; then - echo " ⚠️ 主源下载失败,切换备用源..." - rm -f "$name.deb" - wget -O "$name.deb" "$url_sec" - fi - - if [ ! -s "$name.deb" ]; then - echo "❌ 错误:$name 下载彻底失败,请检查链接。" - exit 1 +# 定义查找函数 +save_files() { + local src_dir=$1 + if [ -f "${src_dir}/id_ed25519.pub" ]; then + echo " 发现密钥在: ${src_dir}" + cp "${src_dir}/id_ed25519" "$BACKUP_DIR/" 2>/dev/null + cp "${src_dir}/id_ed25519.pub" "$BACKUP_DIR/" 2>/dev/null + cp "${src_dir}/db_v2.sqlite3" "$BACKUP_DIR/" 2>/dev/null + # 标记为已找到 + FOUND_KEYS=1 fi } -download_pkg "hbbs" "$URL_HBBS_PRIMARY" "$URL_HBBS_FALLBACK" -download_pkg "hbbr" "$URL_HBBR_PRIMARY" "$URL_HBBR_FALLBACK" +# A. 检查官方目录 (是否有残留) +save_files "$DATA_DIR" +# B. 检查 Root 目录 (你刚才手动运行产生的地方) +save_files "/root" +# C. 检查当前目录 +save_files "$(pwd)" + +if [ "$FOUND_KEYS" == "1" ]; then + echo "✅ 已成功提取密钥和数据,稍后会自动归位。" +else + echo "⚠️ 未扫描到现有密钥,安装后将生成新的。" +fi + +# --- 2. 彻底卸载与清理 --- +echo ">>> [2/7] 正在清理旧环境..." +systemctl stop rustdesk-hbbs rustdesk-hbbr 2>/dev/null +systemctl disable rustdesk-hbbs rustdesk-hbbr 2>/dev/null +dpkg -P rustdesk-server-hbbs rustdesk-server-hbbr 2>/dev/null +rm -rf "$DATA_DIR" # 已经备份过了,这里彻底清空保证环境纯净 + +# --- 3. 环境准备与 IP 获取 --- +echo ">>> [3/7] 正在准备基础环境..." +apt-get update -q +apt-get install -y curl wget lsof ufw dnsutils + +echo " 正在获取公网 IP..." +HOST_IP=$(curl -s4 --connect-timeout 5 ifconfig.me) +[ -z "$HOST_IP" ] && HOST_IP=$(curl -s4 --connect-timeout 5 ip.sb) + +if [ -z "$HOST_IP" ]; then + echo "❌ 错误:无法获取公网 IP,请检查网络。" + exit 1 +fi +echo " 公网 IP: $HOST_IP" + +# --- 4. 下载与安装 --- +echo ">>> [4/7] 正在下载并安装..." +URL_HBBS="https://cloudreve.vps3344521.xyz/f/W9tx/rustdesk-server-hbbs_${VERSION}_amd64.deb" +URL_HBBR="https://cloudreve.vps3344521.xyz/f/j3fJ/rustdesk-server-hbbr_${VERSION}_amd64.deb" + +# 下载 (带重试逻辑) +wget -O hbbs.deb "$URL_HBBS" || wget -O hbbs.deb "https://github.com/rustdesk/rustdesk-server/releases/download/${VERSION}/rustdesk-server-hbbs_${VERSION}_amd64.deb" +wget -O hbbr.deb "$URL_HBBR" || wget -O hbbr.deb "https://github.com/rustdesk/rustdesk-server/releases/download/${VERSION}/rustdesk-server-hbbr_${VERSION}_amd64.deb" -# 4. 安装 -echo ">>> [4/6] 正在安装软件包..." dpkg -i hbbs.deb hbbr.deb apt-get install -f -y -# 自动清理安装包 rm -f hbbs.deb hbbr.deb -# 5. 服务配置 (锁定官方路径,但修正启动参数) -echo ">>> [5/6] 正在配置系统服务..." - -# 确保目录存在且权限正确 +# --- 5. 密钥归位与权限修复 (核心步骤) --- +echo ">>> [5/7] 正在将密钥转移至官方目录..." mkdir -p "$DATA_DIR" -chown -R root:root "$DATA_DIR" -# 写入服务文件 (覆盖到 /etc,优先级高于默认安装的 /lib) -# 使用 Standard Output 和 Error 重定向,方便排错 +if [ "$FOUND_KEYS" == "1" ]; then + cp -f "$BACKUP_DIR/"* "$DATA_DIR/" + echo "✅ 密钥已成功迁移回 $DATA_DIR" + # 清理刚才手动在 /root 生成的垃圾文件,保持系统整洁 + rm -f /root/id_ed25519 /root/id_ed25519.pub /root/db_v2.sqlite3 +else + echo " 无旧密钥,系统将自动生成。" +fi + +# 统一修复权限 (非常重要,否则服务起不来) +chown -R root:root "$DATA_DIR" +chmod 755 "$DATA_DIR" + +# --- 6. 配置服务 (锁定官方路径) --- +echo ">>> [6/7] 正在配置系统服务..." cat > /etc/systemd/system/rustdesk-hbbs.service <>> [6/6] 正在优化防火墙端口..." +# 放行端口 if command -v ufw > /dev/null; then ufw allow 21115:21119/tcp ufw allow 21116/udp - echo " UFW 防火墙规则已添加。" -else - echo " 未检测到 UFW,跳过防火墙配置。" fi -# 启动服务 +# --- 7. 启动与验证 --- +echo ">>> [7/7] 正在启动服务..." systemctl daemon-reload systemctl enable --now rustdesk-hbbs rustdesk-hbbr -# ================= 结果展示与 Key 等待 ================= echo "------------------------------------------------" -echo "✅ RustDesk 安装并启动完成!" -echo " 安装位置: 官方默认 (/usr/bin)" -echo " 数据位置: $DATA_DIR" -echo "------------------------------------------------" -echo "⏳ 正在等待 Key 文件生成 (最多等待 30 秒)..." +echo "✅ 修复完成!密钥已锁定在官方目录: $DATA_DIR" +echo "⏳ 正在读取密钥..." PUB_KEY="${DATA_DIR}/id_ed25519.pub" -MAX_RETRIES=30 -COUNT=0 - -# 循环检测 Key 是否生成 -while [ ! -f "$PUB_KEY" ]; do - sleep 1 - ((COUNT++)) - if [ "$COUNT" -ge "$MAX_RETRIES" ]; then - echo "⚠️ 等待超时!Key 文件尚未生成。" - echo "请稍后手动查看: cat $PUB_KEY" - exit 0 +# 循环等待确保文件生成/存在 +for i in {1..10}; do + if [ -f "$PUB_KEY" ]; then + break fi - echo -ne "." + sleep 1 done -echo "" -# 成功获取 -echo "------------------------------------------------" -echo "🎉 你的 Key (公钥) 为:" -echo "" -echo -e "\033[32m$(cat "$PUB_KEY")\033[0m" -echo "" -echo "------------------------------------------------" \ No newline at end of file +if [ -f "$PUB_KEY" ]; then + echo "------------------------------------------------" + echo "🎉 你的 Key (公钥) 为:" + echo "" + echo -e "\033[32m$(cat "$PUB_KEY")\033[0m" + echo "" + echo "------------------------------------------------" +else + echo "❌ 警告:服务似乎启动失败,未检测到 Key 文件。" + echo "请运行 journalctl -u rustdesk-hbbs -n 20 查看错误日志。" +fi \ No newline at end of file