如何通过 ssh 单独复制和 gzip 文件

gro*_*ojo 3 linux ssh gzip

我想使用 ssh 传输一个包含未压缩文件的目录,并在此过程中单独对它们进行 gzip 压缩。谁能推荐一个简单的oneliner来实现这一目标?

例如。

fileA.ext -> ssh/pipe -> fileA.ext.gz

我一直在通过 ssh 压缩 tar 管道,但随后文件在管道末端未压缩。在这种情况下,我希望它们保持压缩状态。

预先压缩是可能的,但需要本地空间,或者每个文件需要一个连接(?)

有 6000 多个文件,我更喜欢使用单个连接传输所有文件的解决方案(尽管我确实使用密钥进行身份验证!)

Bit*_*nce 6

我想您更愿意先对它们进行 gzip,然后再将它们发送出去。

cat dafile | gzip -c | ssh remote "cat > dafile"
Run Code Online (Sandbox Code Playgroud)

重复相关的循环结构。例如

find -type f | while read fname ; do cat $fname | gzip -c | ssh remote "cat > $fname" ; done
Run Code Online (Sandbox Code Playgroud)

...或类似的东西。需要设置 pkey 访问,否则这将是一项大规模的密码快速输入练习。

编辑:

关于单个连接的主题,请参见 man ssh_config ControlMaster。这意味着您可以节省协商 6000 个 SSH 会话中的 5999 个的开销。

编辑2:

哈哈!我赢了!

tar zcf - /dir/of/files | ssh remote "tar zxf - --to-command=mygzip.sh"
Run Code Online (Sandbox Code Playgroud)

远程机器上的 mygzip.sh 如下所示:

#!/bin/sh
mkdir -p "$(dirname $TAR_FILENAME)"
gzip -c > "${TAR_FILENAME}.gz"
Run Code Online (Sandbox Code Playgroud)