核心思路是利用tar生成标准输出数据流,通过管道经ssh传输,在目标端直接保存或解压,全程不落地临时文件,节省空间、提升效率、便于脚本自动化。

Linux 中用 tar 结合管道符做远程备份,核心思路是:本地或远程端用 tar 打包生成数据流,不落地为文件,而是直接通过 管道(|)传给 ssh,再在目标端接收并写入磁盘或解压。整个过程不生成中间临时文件,节省空间、提升效率,适合自动化和脚本调用。
本地打包 → 远程保存为压缩包
适用于把本地目录完整打包,传到远程服务器存档(如备份到 NAS 或另一台 VPS):
- 命令结构:sudo tar -czf - --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/tmp / | ssh user@host "cat > /backup/system-$(date +\%Y%m%d).tar.gz"
- -f - 表示输出到标准输出(即管道),不是写入本地文件
- ssh user@host "cat > ..." 表示登录远程主机后,把接收到的数据流原样保存为 .tar.gz 文件
- 注意排除运行时目录(/proc、/sys 等),否则会报错或备份无效内容
本地打包 → 远程直接解压还原
适合快速部署或灾备恢复:跳过存档步骤,边传边解,省去磁盘空间和二次操作:
- 命令结构:sudo tar -czf - /etc /home/user/docs | ssh user@host "sudo tar -xzf - -C /restore/"
- 远程端需有对应权限(如解压到系统目录通常要 sudo)
- -C /restore/ 指定解压目标根目录,所有路径按归档内相对路径展开
- 该方式不保留远程端原路径的绝对前缀(如 /etc 在归档中存为 etc/),所以解压位置由 -C 控制
远程打包 → 本地保存为压缩包
更常用场景:备份远程服务器上的网站、配置等,数据落回本地机器(安全可控、便于校验):
- 命令结构:ssh user@host "sudo tar -czf - --exclude='/var/log/*' /www/wwwroot/example.com" > example-backup-$(date +\%Y%m%d).tar.gz
- 所有打包动作在远程执行,ssh 命令整体作为输入源,本地用重定向 > 接收
- 注意远程路径中的通配符(如 '/var/log/*')必须加单引号,防止被本地 shell 提前展开
- 若想看到进度,可在末尾加 | pv -b(需提前安装 pv 工具)
配合 nohup 防中断 + 后台运行
大目录传输耗时长,终端断开易失败。用 nohup 可保障持续执行:
- 示例:nohup ssh user@host "sudo tar -czf - /opt/app" > /backup/app-latest.tar.gz 2>&1 &
- 2>&1 把错误和标准输出都重定向到文件,方便后续排查
- 运行后可用 ps aux | grep nohup 或检查 nohup.out 确认状态











