本文目录导读:

我来帮你编写一个系统备份脚本,这里提供两个版本:一个简单的通用备份脚本和一个更完整的系统备份方案。
简单通用备份脚本
#!/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
注意事项
- 测试备份: 定期测试备份文件的完整性
- 存储位置: 建议将备份保存到外部存储或网络位置
- 加密敏感数据: 包含密码或密钥的配置文件建议加密
- 监控备份大小: 定期检查备份文件大小,避免磁盘满载
- 保留策略: 设置合理的备份保留期限
这个脚本可以根据你的具体需求进行修改和扩展!