tar配合管道可跳过本地磁盘中转,实现边打包边远程传输;通过tar -cf -与ssh组合,结合--exclude排除虚拟目录、pv显示进度、sha256sum校验及cron定时,构建高效可靠备份方案。

直接用 tar 配合管道,能跳过本地磁盘中转,把数据边打包边传到远程或另一台机器,既省空间又提速。关键在于让 tar 不写入文件,而是把归档流通过管道交给 ssh 或其他工具处理。
基础远程备份:tar + ssh 直传
这是最常用也最实用的方式。源端 tar 打包,通过管道交给 ssh,目标端 ssh 接收后直接解压,全程不落地。
- 命令结构:tar -cf - [目录] | ssh user@host "tar -xf - -C /path"
- -f - 表示 tar 读写标准输入/输出,而不是文件;两个 - 分别代表“从 stdin 打包”和“向 stdout 解包”
- 例如备份本地 /var/www 到远程服务器的 /backup/www:
tar -czf - /var/www | ssh user@192.168.1.100 "mkdir -p /backup && tar -xzf - -C /backup" - 加 -z 表示启用 gzip 压缩,减少网络传输量;若网络带宽高、CPU 弱,可换为 -J(xz)获得更高压缩率
排除干扰目录,提升传输效率
系统里有些目录(如 /proc、/sys、/dev、/run)是虚拟文件系统,不能也不该备份;日志、缓存等临时内容也会拖慢速度、浪费带宽。
- 用 --exclude 显式跳过:
tar -czf - --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/var/log / | ssh ... - 多个排除项可合并写成一行,也可用 --exclude-from=excludes.txt 把路径列表单独存文件,便于复用和维护
- 注意:排除路径必须与 tar 实际遍历路径一致,建议在根目录下执行并用绝对路径排除
带进度与校验的可靠迁移
大容量迁移时,看不到进度容易误判卡死;缺乏校验则无法确认远端数据是否完整。
- 加 -v 可看文件名滚动,但不显示百分比;更推荐用 pv(pipe viewer)工具:
tar -cf - /data | pv -s $(du -sb /data | awk '{print $1}') | ssh ... "tar -xf - -C /dst" - 传输完成后,可在两端分别运行:
ssh user@host "sha256sum /backup/archive.tar.gz" && sha256sum archive.tar.gz
对比哈希值,确认一致性 - 如果只关心结构和内容(不依赖 tar 包本身),可在远端解压后用 rsync -n -a --delete 做一次空运行比对,检查遗漏或差异
配合定时任务实现自动化归档
把管道备份封装进脚本,再交给 cron 定期执行,就能形成轻量级自动化备份链。
- 写一个 backup.sh:
- #!/bin/bash
DATE=$(date +%Y%m%d_%H%M)
tar -czf - --exclude=/proc --exclude=/sys /etc /home | ssh backup@nas "cat > /backup/full_$DATE.tar.gz" - 赋予执行权限:chmod +x backup.sh,再加入 crontab:
0 2 * * * /path/to/backup.sh(每天凌晨2点执行) - 建议在远程端用 logrotate 或简单 shell 清理旧备份,比如保留最近7天:
find /backup -name 'full_*.tar.gz' -mtime +7 -delete











