预挂载samba共享的Cron rsync任务安全风险及防护方案咨询
单纯执行
ls判断目录内容的方案不够稳妥:一是如果共享本身确实存在批量删除文件的正常操作,ls校验会正常执行同步,依然会删除备份文件;二是如果挂载成功但共享权限配置异常导致读不到内容,也会出现误判。更可靠的方案如下:
1. 前置校验机制(推荐优先配置)
你可以通过两类校验判断共享是否正常挂载,校验通过才执行同步:
- 固定标志文件校验:提前在Samba共享的根目录中创建一个专属隐藏文件,比如
.samba_marker,注意不要在本地未挂载的/mnt/share目录中放入该文件。每次同步前先判断该文件是否存在,不存在就直接终止同步。 - 挂载点校验:用
mountpoint命令直接判断目录是否为已挂载的网络文件系统,排除挂载失败访问本地空目录的情况。
可以把同步逻辑写成独立脚本,示例如下:
#!/bin/bash LOG_PATH="/var/log/rsyncbackup.log" # 同时执行两项校验 if ! mountpoint -q /mnt/share || [ ! -f /mnt/share/.samba_marker ]; then echo "$(date "+%Y-%m-%d %H:%M:%S") Samba共享未正常挂载,跳过同步" >> $LOG_PATH exit 1 fi # 校验通过执行同步 /usr/bin/rsync -av --delete /mnt/share/ /mnt/backup/ --log-file=$LOG_PATH
给脚本添加执行权限:chmod +x /usr/local/bin/rsync_samba_backup.sh
之后把cron任务改成调用该脚本即可:0 2 * * 7 /usr/local/bin/rsync_samba_backup.sh
2. rsync原生参数限制删除范围
rsync自带--max-delete参数,可以限制单次同步最多删除的文件数量,超过阈值时rsync会直接终止删除操作,避免备份被清空。
比如设置单次最多删除20个文件,修改后的rsync命令如下:/usr/bin/rsync -av --delete --max-delete=20 /mnt/share/ /mnt/backup/ --log-file=/var/log/rsyncbackup.log
也支持按比例设置,比如--max-delete=10%表示最多删除目标目录10%的文件,适配文件总量变化的场景。
3. 快照兜底机制
如果你的备份分区使用Btrfs、XFS或LVM,可以在每次同步前给备份目录创建快照,就算出现极端情况误删了备份数据,也可以从快照快速恢复。
以Btrfs为例,快照命令示例:btrfs subvolume snapshot /mnt/backup /mnt/backup_snap/$(date +%Y%m%d_%H%M)
你可以定期清理超过30天的旧快照,避免占用过多磁盘空间。
4. 优化fstab挂载参数降低挂载失败概率
在你现有的fstab挂载参数中添加网络挂载专属参数,减少开机挂载失败的概率://ip/share /mnt/share cifs credentials=/home/user/.smbcredentials,uid=user,_netdev,nofail,x-systemd.mount-timeout=30 0 0
参数说明:
_netdev:标记为网络设备挂载,系统会等待网络就绪后再执行挂载,避免开机时网络未加载导致挂载失败nofail:挂载失败时不阻塞系统启动x-systemd.mount-timeout=30:设置30秒挂载超时,避免长时间卡住
内容的提问来源于stack exchange,提问作者spm2600

