scp和压缩同时进行,无中间保存

scp和压缩同时进行,无中间保存

规范的方法是什么:

  • scp文件到远程位置
  • 压缩传输中的文件(tar或不压缩,单个文件或整个文件夹,7za或其他更有效的东西)
  • 执行上述操作而不保存中间文件

我熟悉这样的外壳管道:

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z

本质上:

  • 将整个文件夹合并为一个tar
  • 将数据传递stdoutstdin压缩程序
  • 申请挑衅的压缩

ssh通过链接执行此操作并将文件登陆到远程文件系统的最佳方法是什么?


我宁愿不sshfs安装。


这不起作用:

scp <(tar cvf - MyBackups | 7za a -si -mx=9 -so) localhost:/tmp/tmp.tar.7z

因为:

/dev/fd/63: not a regular file

答案1

有很多方法可以做你想做的事。最简单的是使用 pìpe:

tar zcvf -  MyBackups | ssh user@server "cat > /path/to/backup/foo.tgz"

这里,压缩是由tar哪个调用gzipz标志)来处理的。您还可以使用compress( Z) 和bzip( j)。对于7z,执行以下操作:

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z | 
   ssh user@server "cat > /path/to/backup/foo.7z"

最好的然而,方式可能是rsync

   Rsync is a fast and extraordinarily versatile  file  copying  tool.   It  can  copy
   locally, to/from another host over any remote shell, or to/from a remote rsync dae‐
   mon.  It offers a large number of options that control every aspect of its behavior
   and  permit  very  flexible  specification of the set of files to be copied.  It is
   famous for its delta-transfer algorithm, which reduces the amount of data sent over
   the network by sending only the differences between the source files and the exist‐
   ing files in the destination.  Rsync is widely used for backups and  mirroring  and
   as an improved copy command for everyday use.

rsync方式太多的选择。确实值得一读,但第一眼看到它们很吓人。在这种情况下,您关心的是:

    -z, --compress              compress file data during the transfer
        --compress-level=NUM    explicitly set compression level

   -z, --compress
          With this option, rsync compresses the file data as it is sent to the desti‐
          nation machine, which reduces the amount of data being transmitted --  
          something that is useful over a slow connection.

          Note  that this option typically achieves better compression ratios than can
          be achieved by using a compressing remote shell or a  compressing  transport
          because  it takes advantage of the implicit information in the matching data
          blocks that are not explicitly sent over the connection.

所以,就你而言,你会想要这样的东西:

rsync -z MyBackups user@server:/path/to/backup/

文件在传输过程中会被压缩,并在到达目的地时解压。


更多选择:

  • scp本身可以压缩数据

     -C      Compression enable.  Passes the -C flag to ssh(1) to
             enable compression.
    
    $ scp -C source user@server:/path/to/backup
    
  • 也许有一种方法可以让你rsync表现7za得很好,但这样做是没有意义的。这样做的好处rsync是它只会复制本地和远程文件之间发生更改的位。然而,一个小的本地更改可能会导致一个非常不同的压缩文件,因此没有必要使用rsync它。它只会让事情变得复杂,没有任何好处。直接使用ssh如上图所示即可。如果你真的想要做到这一点,您可以尝试通过给出一个子 shell 作为 的参数rsync。在我的系统上,我无法使用它,7za因为它不允许您将压缩数据写入终端。也许您的实现有所不同。尝试类似(这对我不起作用):

    rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \
      user@server:/path/to/backup
    
  • 还有一点是7z 不应用于 Linux 上的备份。如手册页所述7z

    不要在 Linux/Unix 上使用 7-zip 格式进行备份,因为:
    - 7-zip 不存储文件的所有者/组。

答案2

我认为这个命令可以解决问题

ssh user@host "cd /path/to/data/;tar zc directory_name" | tar zx 

现在,首先您必须从目标主机执行此命令。以及需要解释的细节:

  1. ssh user@host 将打开与主机的连接,从主机传输数据。
  2. cd /path/to/data 将进入存储所需数据的目录
  3. tar zc * 将启动压缩并将其放入 STDOUT
  4. 现在,pipe(|) 会将源的 STDOUT 传输到正在运行“tar zx”的目标的 STDIN,并不断解压来自源的数据流。

正如您所看到的,此命令会即时压缩并节省带宽。您也可以使用其他压缩来获得更好的结果,但请记住,压缩和解压缩需要 CPU 周期。

参考

答案3

小改进dkbhadeshiya 的回答:您不必这样做cd dir,只需指定工作目录即可tar

ssh user@host "tar -C /path/to/data/ -zc directory_name" | tar zx 

您也可以用同样的方式上传目录:

tar zc directory_name/ | ssh user@host "tar zx -C /new/path/to/data/"

相关内容