可行但不推荐,因zip流式传输依赖远端unzip支持stdin且兼容性差;生产环境应优先使用tar -czf - | ssh "tar -xzf - -c /target"实现稳定不落盘传输。

可以直接用 zip 命令生成压缩流,配合 -(标准输出)参数,再通过管道交给 ssh 执行远程解压,全程不落地、不生成中间文件。关键在于让 zip 输出到 stdout,远端用 unzip - 从 stdin 读取。
前提条件
- 本地安装
zip,远端安装unzip(若未安装,先执行ssh user@host 'sudo apt install unzip'或对应包管理命令) - 双方时间同步非必需,但建议确保 SSH 连通且权限正常
✅ 核心命令(单文件或目录)
zip -r - /path/to/dir | ssh user@host "unzip -d /remote/target/ -"
说明:
-
zip -r - /path/to/dir:递归压缩/path/to/dir,-表示输出到标准输出(即管道) -
ssh user@host "unzip -d /remote/target/ -":登录远端后,用unzip -从 stdin 读取数据,并解压到/remote/target/
⚠️ 注意:远端目标目录需已存在,且有写入权限;
unzip -必须加-,否则会等待文件名输入。
✅ 带进度与错误处理的增强写法
zip -r - /path/to/dir 2>/dev/null | ssh user@host "mkdir -p /remote/target/ && unzip -q -d /remote/target/ - 2>/dev/null"
-
2>/dev/null屏蔽本地 zip 的警告(如“warning: name not matched”) -
mkdir -p确保远端路径存在 -
-q让 unzip 静默运行,避免干扰管道流
✅ 压缩时启用更高压缩率(可选)
zip -r - /path/to/dir -Z bzip2 | ssh user@host "unzip -d /remote/target/ -"
⚠️ 但注意:unzip 默认不支持 bzip2 流,需远端改用 7z 或 bsdtar;更稳妥做法是用 tar + gzip 替代(见下文对比)。
? 对比:为什么 zip 管道不如 tar.gz 常用?
| 特性 |
zip 管道 |
tar -cz 管道 |
|---|---|---|
| 原生 stdin/stdout 支持 | ✅(zip -, unzip -) |
✅(tar -czf -, tar -xzf -) |
| 远端通用性 | ❌ 多数 Linux 默认无 unzip - 流支持(部分老版本报错) |
✅ tar 几乎全系统预装,tar -xzf - 稳定可靠 |
| 压缩效率 | 一般 | 更高(尤其文本类) |
| 推荐替代写法 | tar -czf - /dir \| ssh host "tar -xzf - -C /target" |
— |
所以生产环境更推荐:
tar -czf - /path/to/dir | ssh user@host "mkdir -p /remote/target && tar -xzf - -C /remote/target"
✅ 验证是否成功(附加小技巧)
上传后可快速校验远端解压结果:
ssh user@host "find /remote/target -type f | head -n 5"
或统计文件数:
ssh user@host "find /remote/target -type f | wc -l"
不复杂但容易忽略细节:zip 的流式传输可行,但稳定性和兼容性不如 tar 管道,日常建议优先用后者。











