如何编写无人值守Bash脚本实现服务器全镜像自动备份(适配SSH与sudo密码验证)
如何编写无人值守Bash脚本实现服务器全镜像自动备份(适配SSH与sudo密码验证)
我来帮你搞定这个无人值守备份的需求——核心是解决SSH和sudo的交互式密码输入问题,然后把备份逻辑封装成脚本,再交给cron定时执行。下面是一步步的具体操作:
第一步:配置SSH免密登录(解决SSH密码输入问题)
手动SSH需要输密码,我们可以通过密钥认证来实现免密登录:
- 在你执行备份的本地机器上生成密钥对(推荐用更安全的ed25519算法):
按提示一路回车即可,不需要设置密钥密码(否则cron执行时还是需要输密码)。ssh-keygen -t ed25519 - 将公钥复制到目标服务器的对应用户下:
这一步需要手动输一次目标服务器的SSH密码,之后再登录就不需要输密码了。ssh-copy-id username@Server.xxx
第二步:配置目标服务器sudo免密执行dd(解决sudo密码输入问题)
原来的命令里需要sudo dd,我们可以让目标服务器上的用户无需输入密码就能执行这个命令:
- 在目标服务器上用
visudo编辑sudoers配置(一定要用visudo,直接编辑/etc/sudoers会有语法错误风险):sudo visudo - 在文件末尾添加一行(把
username替换成你的实际用户名):
这行配置的意思是:该用户在所有主机上,无需输入密码就能执行username ALL=(ALL) NOPASSWD: /usr/bin/dd/usr/bin/dd命令。 - 保存退出后,测试一下:在本地执行
ssh username@Server.xxx "sudo dd --version",如果不需要输密码就成功输出版本信息,说明配置生效了。
第三步:编写备份脚本
创建一个名为server_backup.sh的脚本,内容如下(替换成你的实际路径和服务器信息):
#!/bin/bash # 服务器全镜像自动备份脚本 # 配置参数,根据实际情况修改 BACKUP_LOCAL_DIR="/home/yourname/backups" # 本地存储备份文件的目录 SERVER_USER="username" # 目标服务器的用户名 SERVER_HOST="Server.xxx" # 目标服务器的地址/域名 DISK_DEVICE="/dev/sda" # 目标服务器要备份的磁盘设备(注意:有些服务器可能是/dev/nvme0n1,先确认清楚!) # 生成带日期的备份文件名 BACKUP_FILENAME="fullServerXX-$(date +%d%m%y).img.gz" # 确保本地备份目录存在 mkdir -p "$BACKUP_LOCAL_DIR" # 执行备份命令:远程执行dd并压缩,本地接收保存 ssh "$SERVER_USER@$SERVER_HOST" "nohup sudo dd if=$DISK_DEVICE | gzip -1 -" | dd of="$BACKUP_LOCAL_DIR/$BACKUP_FILENAME" # 可选:记录备份日志,方便排查问题 LOG_FILE="$BACKUP_LOCAL_DIR/backup_logs.txt" if [ $? -eq 0 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') 备份成功:$BACKUP_LOCAL_DIR/$BACKUP_FILENAME" >> "$LOG_FILE" else echo "$(date +'%Y-%m-%d %H:%M:%S') 备份失败!请检查服务器连接或磁盘状态" >> "$LOG_FILE" fi # 可选:自动清理30天前的旧备份(避免磁盘占满) find "$BACKUP_LOCAL_DIR" -name "*.img.gz" -mtime +30 -delete
第四步:给脚本加执行权限
在本地机器上执行:
chmod +x server_backup.sh
第五步:配置cron定时执行
让脚本定期自动运行,比如每周日凌晨2点执行:
- 打开cron配置:
crontab -e - 在文件末尾添加一行(替换成你的脚本实际路径):
解释一下cron的时间格式:0 2 * * 0 /home/yourname/scripts/server_backup.sh分 时 日 月 周,这里0 2 * * 0就是每周日凌晨2点执行。
一些注意事项
- 确认磁盘设备:一定要确认目标服务器的磁盘是
/dev/sda还是其他(比如/dev/nvme0n1),可以在目标服务器上用lsblk命令查看。 - 压缩级别调整:gzip的
-1是最快压缩,如果你想更高压缩率可以改成-9,但会消耗更多CPU资源。 - 磁盘空间:全镜像备份文件很大,确保本地存储目录有足够的空间,或者考虑用远程存储(比如S3、NFS)。
- 测试脚本:先手动执行一次脚本
./server_backup.sh,确认备份成功后再配置cron,避免定时执行出问题。
备注:内容来源于stack exchange,提问作者Pythonaire
相关产品推荐
相关产品推荐

