发布于2026-08-05 阅读(0)
扫一扫,手机访问
先看一个实际场景:把本地 GitBook 项目或者某个大文件直接扔到远程服务器上。常规做法是用 scp,但这里提供了一种更灵活的管道玩法——通过 SSH 远程传输,中间还能加进度条和并行压缩。下面这个脚本就是干这事儿的。

#安装工具 yum install -y pigz pv #压缩gitbook目录传输 cd /gitee tar -czf - gitbook|ssh root@118.178.93.190 'tar -xzf - -C /work' #压缩文件传输 tar -czf - nginx:1.31-alpine-slim.tar.gz|ssh root@118.178.93.190 'tar -xzf - -C /work'
#压缩gitbook目录传输 cd /gitee tar -cf - gitbook|pigz|pv|ssh root@118.178.93.190 'tar -xzf - -C /work' #压缩文件传输 tar -cf - nginx:1.31-alpine-slim.tar.gz|pigz|pv|ssh root@118.178.93.190 'tar -xzf - -C /work'
先说说两个小工具。 pigz 是 gzip 的并行版本,能充分利用多核 CPU 加速压缩,兼容性跟 gzip 一样好。 pv 则负责显示进度条、传输速度和剩余时间,等大文件传输时能看见进度,心里踏实。
实际跑一下看看效果(这里只演示了初始版本,加了密码验证):
[root@00fly gitee]# ls docker-demo docker-run dos2unix.sh effict-side gitbook git-update.sh microservice-all-in-one springcloud-swarm [root@00fly gitee]# tar -czf - gitbook|ssh root@118.178.93.190 'tar -xzf - -C /work' root@118.178.93.190's password:
接下来把代码拆开,逐个解释每个部件的作用。
-x 解包,-z 解压,-f - 表示从标准输入读取数据(即管道过来的压缩流),-C /work 指定解压到 /work 目录。为了方便日常使用,可以写一个交互式脚本,让用户选择本地文件、输入远程 IP 和目录,自动生成并执行命令。下面就是这样的 files-p2p.sh:
#!/bin/bash # 定义默认服务器地址 DEFAULT_IP="120.55.67.54" # 显示欢迎信息 echo "======================================" echo " 文件上传配置工具" echo "======================================" echo "" # 步骤1:显示本地文件列表并让用户选择 echo "【步骤1】请选择本地文件(输入序号):" echo "--------------------------------------" files=() # 存储文件序号和名称 for i in $(seq 1 10); do # 示例:展示前10个文件(可根据需求调整数量) file=$(ls 2>/dev/null | sed -n "${i}p") if [ -n "$file" ]; then files+=("$i: $file") echo "$i. $file" fi done echo "--------------------------------------" while true; do read -p "输入文件序号(1-${#files[@]}):" choice if [[ $choice =~ ^[0-9]+$ ]] && [ $choice -ge 1 ] && [ $choice -le ${#files[@]} ]; then selected_file="${files[$((choice-1))]}" selected_filename=$(echo "$selected_file" | cut -d' ' -f2-) break else echo "无效的序号,请重新输入!" fi done echo "已选择文件:$selected_filename" echo "" # 步骤2:带超时的服务器IP输入 echo "【步骤2】请输入远程服务器IP地址,否则使用默认值 $DEFAULT_IP):" read -p "IP地址:" server_ip if [ -z "$server_ip" ]; then server_ip=$DEFAULT_IP echo "未输入远程服务器IP地址,使用默认IP:$server_ip" else # 简单IP格式校验(可选) if ! [[ $server_ip =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then echo "IP格式错误,强制使用默认值:$DEFAULT_IP" server_ip=$DEFAULT_IP fi fi echo "" # 步骤3:输入远程服务器文件保存目录 echo "【步骤3】请输入远程服务器文件保存目录:" read -p "保存目录(例如:/work):" remote_dir if [ -z "$remote_dir" ]; then remote_dir="/work" # 设置默认目录(可根据需求调整) echo "未输入目录,使用默认目录:$remote_dir" fi echo "" # 最终输出拼接结果 echo "======================================" echo " 配置结果汇总" echo "======================================" echo "【本地文件或目录】:$selected_filename" echo "【远程服务器IP 】:$server_ip" echo "【远程服务器目录】:$remote_dir" echo "【 生成执行命令 】:tar -cf - ${selected_filename}|pigz|pv|ssh root@$server_ip 'tar -xzf - -C $remote_dir'" echo "======================================" echo "开始执行文件转移命令!" eval "tar -cf - ${selected_filename}|pigz|pv|ssh root@$server_ip 'tar -xzf - -C $remote_dir'"
运行效果如下:
[root@00fly work]# sh files-p2p.sh ====================================== 文件上传配置工具 ====================================== 【步骤1】请选择本地文件(输入序号): -------------------------------------- 1. docker-run 2. effict-side 3. files-p2p.sh 4. p2p.sh 5. top-shell -------------------------------------- 输入文件序号(1-5):2 已选择文件:effict-side 【步骤2】请输入远程服务器IP地址(10秒内输入,否则使用默认值 192.168.0.1): IP地址: 未在规定时间内输入,使用默认IP:192.168.0.1 【步骤3】请输入远程服务器文件保存目录: 保存目录(例如:/data/upload):/work ====================================== 配置结果汇总 ====================================== 本地文件:effict-side 远程服务器IP:192.168.0.1 远程服务器目录:/work 文件转移命令:tar -cf - effict-side|pigz|pv|ssh root@192.168.0.1 'tar -xzf - -C /work'
整个方案的核心思路:本地打包压缩 → 管道传输 → SSH 远程解压。这样做的好处是无需中间文件,实时流式传输,配合 pigz 并行压缩和 pv 进度条,大文件传输时效率更高、体验更好。
有人可能会问:直接用 scp -r 不也能递归复制整个目录吗?确实,比如:
#从本机递归复制整个目录到远程 scp -r /work/docker root@116.196.92.147:/work
但两者各有优劣:scp 简单直接,但无法看到进度,且传输过程中没有压缩(除非手动加 -C 选项)。而管道方案可以灵活组合压缩、进度显示,甚至能按需调整并行度。建议大家拿一个大目录实际测试对比一下,看看速度差异。上面脚本中第 69 和 72 行就是执行命令的地方,感兴趣可以自行修改参数跑一跑。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8