You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写无人值守Bash脚本实现服务器全镜像自动备份(适配SSH与sudo密码验证)

如何编写无人值守Bash脚本实现服务器全镜像自动备份(适配SSH与sudo密码验证)

我来帮你搞定这个无人值守备份的需求——核心是解决SSH和sudo的交互式密码输入问题,然后把备份逻辑封装成脚本,再交给cron定时执行。下面是一步步的具体操作:

第一步:配置SSH免密登录(解决SSH密码输入问题)

手动SSH需要输密码,我们可以通过密钥认证来实现免密登录:

  1. 在你执行备份的本地机器上生成密钥对(推荐用更安全的ed25519算法):
    ssh-keygen -t ed25519
    
    按提示一路回车即可,不需要设置密钥密码(否则cron执行时还是需要输密码)。
  2. 将公钥复制到目标服务器的对应用户下:
    ssh-copy-id username@Server.xxx
    
    这一步需要手动输一次目标服务器的SSH密码,之后再登录就不需要输密码了。

第二步:配置目标服务器sudo免密执行dd(解决sudo密码输入问题)

原来的命令里需要sudo dd,我们可以让目标服务器上的用户无需输入密码就能执行这个命令:

  1. 在目标服务器上用visudo编辑sudoers配置(一定要用visudo,直接编辑/etc/sudoers会有语法错误风险):
    sudo visudo
    
  2. 在文件末尾添加一行(把username替换成你的实际用户名):
    username ALL=(ALL) NOPASSWD: /usr/bin/dd
    
    这行配置的意思是:该用户在所有主机上,无需输入密码就能执行/usr/bin/dd命令。
  3. 保存退出后,测试一下:在本地执行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点执行:

  1. 打开cron配置:
    crontab -e
    
  2. 在文件末尾添加一行(替换成你的脚本实际路径):
    0 2 * * 0 /home/yourname/scripts/server_backup.sh
    
    解释一下cron的时间格式:分 时 日 月 周,这里0 2 * * 0就是每周日凌晨2点执行。

一些注意事项

  • 确认磁盘设备:一定要确认目标服务器的磁盘是/dev/sda还是其他(比如/dev/nvme0n1),可以在目标服务器上用lsblk命令查看。
  • 压缩级别调整:gzip的-1是最快压缩,如果你想更高压缩率可以改成-9,但会消耗更多CPU资源。
  • 磁盘空间:全镜像备份文件很大,确保本地存储目录有足够的空间,或者考虑用远程存储(比如S3、NFS)。
  • 测试脚本:先手动执行一次脚本./server_backup.sh,确认备份成功后再配置cron,避免定时执行出问题。

备注:内容来源于stack exchange,提问作者Pythonaire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 12:30:29