From 95fb401bdc9789909d6c18490c8867e2a4f24a8f Mon Sep 17 00:00:00 2001 From: mango Date: Mon, 2 Feb 2026 16:31:24 +0800 Subject: [PATCH] =?UTF-8?q?v3.8:=20=E5=AE=8C=E6=95=B4=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=88=A0=E9=99=A4=E6=89=8B=E5=8A=A8=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E7=9A=84=E4=BA=8C=E8=BF=9B=E5=88=B6=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=92=8Csystemd=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vps-snapshot.sh | 64 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/vps-snapshot.sh b/vps-snapshot.sh index 61d300a..9dccf2b 100755 --- a/vps-snapshot.sh +++ b/vps-snapshot.sh @@ -1,7 +1,7 @@ #!/bin/bash #=============================================================================== -# VPS 快照备份脚本 v3.7.6 +# VPS 快照备份脚本 v3.8.6 # 支持: Ubuntu, Debian, CentOS, Alpine # 功能: 智能识别应用 + Docker迁移 + 数据备份 + Telegram通知 #=============================================================================== @@ -19,7 +19,7 @@ LOG_FILE="/var/log/vps-snapshot.log" print_banner() { echo -e "${BLUE}" echo "╔═══════════════════════════════════════════════════════════╗" - echo "║ VPS 快照备份脚本 v3.7 ║" + echo "║ VPS 快照备份脚本 v3.8 ║" echo "║ 智能识别 + Docker迁移 + 数据备份 ║" echo "╚═══════════════════════════════════════════════════════════╝" echo -e "${NC}" @@ -512,6 +512,17 @@ create_snapshot() { apk list -I 2>/dev/null | awk -F' ' '{print $1}' | sed 's/-[0-9].*//' > "$tmp_dir/installed-packages.txt" fi + # 保存二进制文件列表(用于完整恢复 - 追踪手动安装的程序) + log "保存二进制文件列表..." + { + ls -1 /usr/local/bin/ 2>/dev/null + ls -1 /usr/local/sbin/ 2>/dev/null + ls -1 /opt/ 2>/dev/null + } | sort -u > "$tmp_dir/binary-files.txt" + + # 保存 systemd 服务列表 + ls -1 /etc/systemd/system/*.service 2>/dev/null | xargs -I{} basename {} > "$tmp_dir/systemd-services.txt" 2>/dev/null || true + if command -v docker &>/dev/null && docker info &>/dev/null; then docker_export "$tmp_dir" fi @@ -647,6 +658,55 @@ do_full_restore() { fi fi + # 删除快照后新增的二进制文件和服务 + if [ -f "$tmp_dir/binary-files.txt" ]; then + log "清理新增的二进制文件..." + + # 检查 /usr/local/bin/ + for f in /usr/local/bin/*; do + [ -e "$f" ] || continue + local fname=$(basename "$f") + if ! grep -qx "$fname" "$tmp_dir/binary-files.txt" 2>/dev/null; then + log "删除: /usr/local/bin/$fname" + rm -f "$f" + fi + done + + # 检查 /usr/local/sbin/ + for f in /usr/local/sbin/*; do + [ -e "$f" ] || continue + local fname=$(basename "$f") + if ! grep -qx "$fname" "$tmp_dir/binary-files.txt" 2>/dev/null; then + log "删除: /usr/local/sbin/$fname" + rm -f "$f" + fi + done + fi + + # 删除快照后新增的 systemd 服务 + if [ -f "$tmp_dir/systemd-services.txt" ]; then + log "清理新增的 systemd 服务..." + for f in /etc/systemd/system/*.service; do + [ -e "$f" ] || continue + local fname=$(basename "$f") + if ! grep -qx "$fname" "$tmp_dir/systemd-services.txt" 2>/dev/null; then + log "停止并删除服务: $fname" + systemctl stop "$fname" 2>/dev/null || true + systemctl disable "$fname" 2>/dev/null || true + rm -f "$f" + fi + done + systemctl daemon-reload 2>/dev/null || true + fi + + # 清理相关配置目录 + log "清理相关配置..." + # sing-box 相关 + rm -rf /usr/local/etc/sing-box /etc/sing-box 2>/dev/null || true + # 其他常见手动安装程序的配置 + rm -rf /usr/local/etc/v2ray /etc/v2ray 2>/dev/null || true + rm -rf /usr/local/etc/xray /etc/xray 2>/dev/null || true + # 停止并删除所有Docker容器 if command -v docker &>/dev/null; then log "清理现有 Docker 环境..."