首页/数据/备份与容灾速查/tar 管道与远程传输

tar 管道与远程传输

tar 与管道结合可边打包边压缩边传输(tar | ssh),不落中间文件,适合跨主机迁移与紧急传输;代价是中断后需要重传。

备份与容灾速查数据更新于 2026-10-13

tar 管道传输是什么

tar 可以把归档写到标准输出,配合管道直接交给压缩程序或 ssh 送到远端,全程不落中间文件。它适合磁盘空间紧张或需要边打包边传输的场景,代价是流式操作没有索引:中断就要重传,出错也难以回退定位。

基本信息

适用平台Linux / Unix(GNU tar 与 bsdtar 选项略有差异)
核心机制-f - 表示读写标准输出或标准输入,可与 gzip、zstd、ssh 组合
常见组合tar czf - | ssh host 'cat > file',或 tar | zstd | ssh
权限要求备份系统文件需 root;--numeric-owner 可避免跨机用户名不一致问题

典型使用场景

  • 跨主机迁移目录:没有足够中转空间,边打包边传
  • 紧急取数:从生产机直接把目录流到备份机,不等本地归档
  • 边传边解包:两端路径口径一致时,一条命令完成迁移
  • 备份到磁带或对象存储流:归档直接写入设备或管道上传
  • 加密传输前的预处理:tar 输出交给压缩与加密工具串成流水线

远程传输与解包

远程传输与解包
# 打包经 ssh 传到远端落盘(注意:远端文件名与流式内容对应)
tar czf - -C /srv app | ssh backup@10.0.0.5 'cat > /backup/app.tar.gz'
# 边传边解包:两端路径口径要一致
tar czf - -C /srv app | ssh backup@10.0.0.5 'tar xzf - -C /restore'
# 本地管道压缩:压缩并行度交给 zstd,不占 tar 进程
tar -cf - /data | zstd -T0 -o /backup/data-$(date +%F).tar.zst
# 脚本里必须开 pipefail,任一段失败才能被检测到
set -o pipefail
tar -cf - /data | zstd -q -o /backup/data.tar.zst || echo '备份失败' >&2

常见管道组合读法

组合作用注意点
tar czf - | ssh 'cat > f'打包压缩后经 SSH 落到远端文件SSH 断开时远端会留下不完整文件,无法自动续传
tar czf - | ssh 'tar xzf - -C dst'边传边解包,省去中间归档目标目录内容被直接覆盖,无法先预览
tar -cf - | zstd -T0只压缩不落原归档,节省本地空间压缩进程崩溃时整个流中断,没有可续传的中间态
tar -cf - --files-from=list按清单选择文件,适合大目录中的子集清单路径必须相对 -C 指定的目录
流式管道没有『再试一次』的地基:磁盘写满、SSH 断开、压缩进程被杀都会让整次传输作废。长距离传输优先考虑 rsync 或带校验的备份工具,tar 管道只用在可控的内网与短任务上。
跨机迁移加 --numeric-owner 可避免用户名映射差异导致属主错乱;源端与目标端有 SELinux 或 ACL 差异时,还要补上 --selinux 与 -p --acls --xattrs 等选项。

易错点

  • 脚本没开 pipefail:tar 或压缩环节静默失败,管道后面的命令仍返回成功,监控显示备份正常
  • 从标准输入解包无法先查看内容:误覆盖目标目录,且出错时无法回退到中间状态
  • SSH 中断不检测:远端留下体积不足的归档文件,恢复时才发现内容被截断
  • 跨机迁移未处理属主与权限:恢复后文件属主变成数字 ID 或落到错误用户,服务启动报权限错误

数据来源与参考

  • GNU tar 手册(-f - 标准输入输出)
  • OpenSSH 手册(ssh 远程命令)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌