如何写一个脚本快速备份系统

wen 实用脚本 2

本文目录导读:

如何写一个脚本快速备份系统

  1. 简单通用备份脚本
  2. 进阶系统备份脚本(完整系统)
  3. 使用说明
  4. 注意事项

我来帮你编写一个系统备份脚本,这里提供两个版本:一个简单的通用备份脚本和一个更完整的系统备份方案。

简单通用备份脚本

#!/bin/bash
# 系统快速备份脚本
# 使用方法: sudo ./backup.sh
# 配置
BACKUP_DIR="/backup"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
HOSTNAME=$(hostname)
BACKUP_NAME="system_backup_${HOSTNAME}_${TIMESTAMP}"
LOG_FILE="${BACKUP_DIR}/backup_${TIMESTAMP}.log"
# 检查是否以root运行
if [ "$EUID" -ne 0 ]; then 
    echo "请使用sudo运行此脚本"
    exit 1
fi
# 创建备份目录
mkdir -p "${BACKUP_DIR}/${BACKUP_NAME}"
# 日志函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "开始系统备份..."
# 1. 备份重要配置文件
log "备份系统配置文件..."
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}/etc_backup.tar.gz" \
    /etc/hosts \
    /etc/hostname \
    /etc/fstab \
    /etc/crontab \
    /etc/ssh/sshd_config \
    /etc/network/interfaces 2>/dev/null || true
# 2. 备份用户家目录(排除缓存和临时文件)
log "备份用户目录..."
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}/home_backup.tar.gz" \
    --exclude="*/cache/*" \
    --exclude="*/tmp/*" \
    --exclude="*/Downloads/*" \
    /home/ 2>/dev/null || true
# 3. 备份软件包列表
log "备份软件包列表..."
if command -v dpkg &> /dev/null; then
    dpkg --get-selections > "${BACKUP_DIR}/${BACKUP_NAME}/packages_list.txt"
elif command -v rpm &> /dev/null; then
    rpm -qa > "${BACKUP_DIR}/${BACKUP_NAME}/packages_list.txt"
fi
# 4. 备份系统服务状态
log "备份服务状态..."
systemctl list-units --type=service --all > "${BACKUP_DIR}/${BACKUP_NAME}/services_list.txt"
# 5. 备份网络配置
log "备份网络配置..."
ip a > "${BACKUP_DIR}/${BACKUP_NAME}/network_config.txt"
ip route > "${BACKUP_DIR}/${BACKUP_NAME}/routing_table.txt"
# 6. 创建备份信息文件
echo "备份信息" > "${BACKUP_DIR}/${BACKUP_NAME}/backup_info.txt"
echo "主机名: $HOSTNAME" >> "${BACKUP_DIR}/${BACKUP_NAME}/backup_info.txt"
echo "备份时间: $(date)" >> "${BACKUP_DIR}/${BACKUP_NAME}/backup_info.txt"
echo "系统版本: $(cat /etc/os-release 2>/dev/null | head -n 2)" >> "${BACKUP_DIR}/${BACKUP_NAME}/backup_info.txt"
echo "内核版本: $(uname -r)" >> "${BACKUP_DIR}/${BACKUP_NAME}/backup_info.txt"
# 7. 打包整个备份
log "创建最终备份包..."
cd "${BACKUP_DIR}"
tar -czf "${BACKUP_NAME}.tar.gz" "${BACKUP_NAME}"
rm -rf "${BACKUP_NAME}"
log "备份完成!备份文件: ${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"
log "备份大小: $(du -h "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" | cut -f1)"

进阶系统备份脚本(完整系统)

#!/bin/bash
# 完整系统备份脚本
# 支持增量备份和加密
# 配置
BACKUP_ROOT="/backup"
BACKUP_TYPE="${1:-full}"  # full 或 incremental
ENCRYPT="${2:-no}"        # yes 或 no
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
HOSTNAME=$(hostname)
LOGFILE="/var/log/backup.log"
SNAPSHOT_FILE="${BACKUP_ROOT}/last_snapshot.txt"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 初始化
init_backup() {
    mkdir -p "${BACKUP_ROOT}"
    echo "开始备份: $(date)" >> "$LOGFILE"
}
# 清理函数
cleanup() {
    echo "清理临时文件..."
    find "${BACKUP_ROOT}" -name "*.tmp" -delete
    find "${BACKUP_ROOT}" -mtime +30 -delete  # 删除30天前的备份
}
# 完整备份
full_backup() {
    local BACKUP_NAME="${HOSTNAME}_full_${TIMESTAMP}"
    local BACKUP_PATH="${BACKUP_ROOT}/${BACKUP_NAME}"
    echo -e "${YELLOW}执行完整系统备份...${NC}"
    mkdir -p "${BACKUP_PATH}"
    # 排除列表
    local EXCLUDE="--exclude=/proc \
                   --exclude=/sys \
                   --exclude=/dev \
                   --exclude=/run \
                   --exclude=/mnt \
                   --exclude=/media \
                   --exclude=/lost+found \
                   --exclude=/tmp \
                   --exclude=/var/cache \
                   --exclude=/var/tmp \
                   --exclude=${BACKUP_ROOT}"
    # 使用tar创建完整备份
    tar $EXCLUDE \
        -czf "${BACKUP_PATH}/system.tar.gz" \
        --ignore-failed-read \
        /
    echo "${TIMESTAMP}" > "$SNAPSHOT_FILE"
    # 记录备份信息
    echo "备份类型: 完整" >> "${BACKUP_PATH}/info.txt"
    echo "备份时间: $(date)" >> "${BACKUP_PATH}/info.txt"
    echo "系统信息: $(uname -a)" >> "${BACKUP_PATH}/info.txt"
    du -sh "${BACKUP_PATH}/system.tar.gz" >> "${BACKUP_PATH}/info.txt"
    echo -e "${GREEN}完整备份完成${NC}"
    echo "备份位置: ${BACKUP_PATH}"
}
# 增量备份
incremental_backup() {
    local BACKUP_NAME="${HOSTNAME}_incr_${TIMESTAMP}"
    local BACKUP_PATH="${BACKUP_ROOT}/${BACKUP_NAME}"
    if [ ! -f "$SNAPSHOT_FILE" ]; then
        echo -e "${RED}没有找到上次备份记录,执行完整备份...${NC}"
        full_backup
        return
    fi
    echo -e "${YELLOW}执行增量备份...${NC}"
    mkdir -p "${BACKUP_PATH}"
    local LAST_BACKUP=$(cat "$SNAPSHOT_FILE")
    # 只备份修改过的文件
    find / -newer "${SNAPSHOT_FILE}" \
            -not -path "/proc/*" \
            -not -path "/sys/*" \
            -not -path "/dev/*" \
            -not -path "/run/*" \
            -not -path "/tmp/*" \
            -not -path "${BACKUP_ROOT}/*" \
            -type f > "${BACKUP_PATH}/changed_files.txt"
    if [ -s "${BACKUP_PATH}/changed_files.txt" ]; then
        tar -czf "${BACKUP_PATH}/changes.tar.gz" \
            -T "${BACKUP_PATH}/changed_files.txt" \
            --ignore-failed-read
        echo "${TIMESTAMP}" > "$SNAPSHOT_FILE"
        echo -e "${GREEN}增量备份完成${NC}"
    else
        echo -e "${YELLOW}没有文件变更${NC}"
        rm -rf "${BACKUP_PATH}"
    fi
}
# 加密备份
encrypt_backup() {
    local BACKUP_FILE="$1"
    if [ ! -f "$BACKUP_FILE" ]; then
        echo -e "${RED}备份文件不存在${NC}"
        return 1
    fi
    echo -e "${YELLOW}加密备份文件...${NC}"
    # 使用gpg加密
    gpg --symmetric --cipher-algo AES256 \
        --output "${BACKUP_FILE}.gpg" \
        "$BACKUP_FILE"
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}加密成功${NC}"
        rm "$BACKUP_FILE"  # 删除未加密文件
        echo 0
    else
        echo -e "${RED}加密失败${NC}"
        return 1
    fi
}
# 备份验证
verify_backup() {
    local BACKUP_FILE="$1"
    echo -e "${YELLOW}验证备份文件完整性...${NC}"
    if tar -tzf "$BACKUP_FILE" &>/dev/null; then
        echo -e "${GREEN}备份完整验证通过${NC}"
        return 0
    else
        echo -e "${RED}备份文件可能损坏${NC}"
        return 1
    fi
}
# 创建定时备份任务
create_cron_job() {
    echo -e "${YELLOW}是否创建定时备份任务?(y/n)${NC}"
    read -r answer
    if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
        local CRON_CMD="0 2 * * * /root/backup.sh incremental"
        (crontab -l 2>/dev/null; echo "$CRON_CMD") | crontab -
        echo -e "${GREEN}已创建定时备份任务 (每天凌晨2点执行增量备份)${NC}"
    fi
}
# 主函数
main() {
    init_backup
    case "$BACKUP_TYPE" in
        "full")
            full_backup
            ;;
        "incremental")
            incremental_backup
            ;;
        "restore")
            echo -e "${YELLOW}恢复功能需要单独编写${NC}"
            ;;
        *)
            echo "使用方法: $0 {full|incremental} [encrypt]"
            echo "示例:"
            echo "  $0 full          # 完整备份"
            echo "  $0 incremental   # 增量备份"
            echo "  $0 full yes      # 完整备份并加密"
            exit 1
            ;;
    esac
    # 处理加密
    if [ "$ENCRYPT" = "yes" ]; then
        encrypt_backup "${BACKUP_ROOT}/${HOSTNAME}_${BACKUP_TYPE}_${TIMESTAMP}/system.tar.gz"
    fi
    # 验证最后创建的备份
    local LAST_BACKUP=$(ls -t "${BACKUP_ROOT}" | head -1)
    verify_backup "${BACKUP_ROOT}/${LAST_BACKUP}/system.tar.gz" 2>/dev/null || true
    cleanup
    echo "备份日志: $LOGFILE"
}
# 执行主程序
main "$@"

使用说明

基本使用

# 保存脚本
sudo nano /usr/local/bin/backup.sh
# 添加执行权限
sudo chmod +x /usr/local/bin/backup.sh
# 运行完整备份
sudo ./backup.sh
# 运行进阶版本
sudo ./backup.sh full          # 完整备份
sudo ./backup.sh incremental   # 增量备份
sudo ./backup.sh full yes      # 完整加密备份

恢复系统

# 恢复配置文件
sudo tar -xzf backup.tar.gz -C /
# 恢复特定目录
sudo tar -xzf etc_backup.tar.gz -C /etc

自动化备份

# 添加到cron
0 3 * * * /usr/local/bin/backup.sh full
0 */6 * * * /usr/local/bin/backup.sh incremental

注意事项

  1. 测试备份: 定期测试备份文件的完整性
  2. 存储位置: 建议将备份保存到外部存储或网络位置
  3. 加密敏感数据: 包含密码或密钥的配置文件建议加密
  4. 监控备份大小: 定期检查备份文件大小,避免磁盘满载
  5. 保留策略: 设置合理的备份保留期限

这个脚本可以根据你的具体需求进行修改和扩展!

抱歉,评论功能暂时关闭!