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 等选项。