利用脚本进行 自动备份

利用脚本进行 自动备份

利用脚本进行 自动备份

脚本编辑

nano backup.sh # 编辑back.sh文件

下面的是备份脚本
优化版本 可以将备份文件上传到多个服务器,同时还可以指定不同的ssh密钥路径

#!/bin/bash

# 服务器A上的源目录
SRC_DIR="/www/backup/webuse_backup"

# 备份文件前缀
BACKUP_NAME_PREFIX="xx_backup"

# 压缩文件格式
ARCHIVE_FORMAT="tar.gz"

# 目标服务器信息
declare -A SERVERS
SERVERS["192.168.1.1"]="root:/root/backup:/root/.ssh/id_rsa_key"
SERVERS["192.168.1.2"]="root:/var/backups:/root/.ssh/server2_id_rsa_key"
SERVERS["203.0.113.15"]="backup_user:/home/backup:/root/.ssh/server3_id_rsa_key"

# 生成备份文件名
current_date=$(date +"%Y%m%d_%H%M%S")
backup_filename="${BACKUP_NAME_PREFIX}_${current_date}.${ARCHIVE_FORMAT}"

# 压缩源目录
tar -czf "${backup_filename}" -C "${SRC_DIR}" .

# 传输备份文件到每个服务器并删除旧备份
for SERVER in "${!SERVERS[@]}"; do
  SSH_USER=$(echo "${SERVERS[$SERVER]}" | cut -d: -f1)
  DST_DIR=$(echo "${SERVERS[$SERVER]}" | cut -d: -f2)
  SSH_PRIVATE_KEY=$(echo "${SERVERS[$SERVER]}" | cut -d: -f3)
  
  # 传输备份文件
  scp -P "22" -i "${SSH_PRIVATE_KEY}" "${backup_filename}" "${SSH_USER}@${SERVER}:${DST_DIR}"
  
  # 保留最多3个备份文件
  ssh -p "22" -i "${SSH_PRIVATE_KEY}" "${SSH_USER}@${SERVER}" "ls -t ${DST_DIR}/${BACKUP_NAME_PREFIX}* | tail -n +4 | xargs --no-run-if-empty rm -f"
done

# 删除本地备份文件
rm -f "${backup_filename}"


优化版本 可以使用指定的密钥进行登录

#!/bin/bash

# 服务器A上的源目录
SRC_DIR="/root/docker/xx"

# 服务器B上的目标目录
DST_DIR="/root/docker/xx"

# 服务器B的IP地址
SERVER_B_IP="xxxxxx"

# 服务器B的SSH用户名
SSH_USER="root"

# 服务器B的SSH端口
SSH_PORT="22"

# 备份文件前缀
BACKUP_NAME_PREFIX="xxx_backup"

# 压缩文件格式
ARCHIVE_FORMAT="tar.gz"

# SSH私钥文件路径
SSH_PRIVATE_KEY="/root/.ssh/all_id_rsa_key"

# 生成备份文件名
current_date=$(date +"%Y%m%d_%H%M%S")
backup_filename="${BACKUP_NAME_PREFIX}_${current_date}.${ARCHIVE_FORMAT}"

# 压缩源目录
tar -czf "${backup_filename}" -C "${SRC_DIR}" .

# 传输备份文件到服务器B
scp -P "${SSH_PORT}" -i "${SSH_PRIVATE_KEY}" "${backup_filename}" "${SSH_USER}@${SERVER_B_IP}:${DST_DIR}"

# 删除本地备份文件
rm -f "${backup_filename}"

# 保留最多3个备份文件
ssh -p "${SSH_PORT}" -i "${SSH_PRIVATE_KEY}" "${SSH_USER}@${SERVER_B_IP}" "ls -t ${DST_DIR}/${BACKUP_NAME_PREFIX}* | tail -n +4 | xargs --no-run-if-empty rm -f"

chmod 600 /root/.ssh/all_id_rsa_key

你需要修改的部分是 SRC_DIRS 数组。每个数组元素代表一个源目录及其对应的目标目录和压缩包前缀。每个数组元素使用 : 分隔这些值,如 /root/docker:backup/SeoulAMD1:docker_data_backup。你可以按需添加、修改或删除数组元素。

使用chmod命令为脚本添加可执行权限:

chmod +x backup.sh

免密登录服务器B

接下来,我们需要在A服务器上安装并配置SSH免密登录到B服务器。请在A服务器上执行以下命令:

sudo apt-get install sshpass  # 安装sshpass(如已安装,请忽略)
ssh-keygen -t rsa -b 4096  # 生成SSH密钥

一路回车即可

ssh-copy-id -i ~/.ssh/id_rsa.pub -p 服务器端口 root@B服务器IP地址   # 将公钥复制到B服务器

可以检测一下,A服务器直接用ssh -p 服务器端口 root@B服务器IP地址是否可以免密登录B服务器,如果可以,说明可以继续下一步。
登录后退出 logout

使用crontab -e命令打开服务器A上的cron配置:

crontab -e

在打开的cron配置文件中,添加以下一行内容以设置每天早上4点30分执行backup.sh脚本。请确保将/path/to/backup.sh替换为实际的脚本文件路径。

30 4 * * * /root/backup.sh

保存并关闭cron配置文件。
现在,每天早上4点30分,脚本将自动执行

如何让文件在打包过程中ssh断开后仍可以运行

添加nohup和在末尾加上&即可
例如

nohup tar -zcvf /root/downloads/xxxx.tar.gz /root/downloads/xxxx &
LICENSED UNDER CC BY-NC-SA 4.0