![如何通过 ssh 单独复制和 gzip 文件](https://linux22.com/image/545561/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20ssh%20%E5%8D%95%E7%8B%AC%E5%A4%8D%E5%88%B6%E5%92%8C%20gzip%20%E6%96%87%E4%BB%B6.png)
我想使用 ssh 传输包含未压缩文件的目录,并在传输过程中逐个对它们进行 gzip 压缩。有人能推荐一个简单的单行程序来实现这个功能吗?
例如。
文件A.ext -> ssh/pipe -> 文件A.ext.gz
我一直使用压缩方式通过 ssh 传输 tar,但文件在管道末端未压缩。在这种情况下,我希望它们保持压缩状态。
预先压缩是可能的,但需要本地空间,或者需要每个文件的连接(?)
有 6000 多个文件,我更喜欢一种可以使用单个连接传输所有文件的解决方案(尽管我确实使用密钥进行身份验证!)
答案1
我想您宁愿先对它们进行 gzip 压缩,然后再发送它们。
cat dafile | gzip -c | ssh remote "cat > dafile"
使用相关循环结构重复。例如
find -type f | while read fname ; do cat $fname | gzip -c | ssh remote "cat > $fname" ; done
... 或者类似的东西。需要设置 pkey 访问权限,否则这将是一个巨大的密码快速输入练习。
编辑:
关于单个连接,请参阅 man ssh_config ControlMaster。这意味着您可以节省协商 6000 个 SSH 会话中的 5999 个的开销。
编辑2:
哈哈!我赢了!
tar zcf - /dir/of/files | ssh remote "tar zxf - --to-command=mygzip.sh"
远程机器上的 mygzip.sh 如下所示:
#!/bin/sh
mkdir -p "$(dirname $TAR_FILENAME)"
gzip -c > "${TAR_FILENAME}.gz"
答案2
GNU 并行可以轻松做到这一点:
find . -type f | parallel "gzip -c {} | ssh server \"cat>{}.gz\""
但它也会查找并发送起始目录下目录中的文件。
或者如果您只想发送单个目录中的所有常规文件:
parallel "gzip -c {} | ssh server \"cat>{}.gz\"" ::: *
答案3
每个人都有自己的技巧来复制不使用 SCP 的文件。这是我的(不使用 SSH),http://linuxtipsandtricks.com/file-manipulation/transferring-files-with-netcat-nc/
其次,如果您坚持使用 SSH,您可能需要在 SSH 中添加“-c arcfour”。
高血压