规范的方法是什么:
scp
文件到远程位置- 压缩传输中的文件(
tar
或不压缩,单个文件或整个文件夹,7za
或其他更有效的东西) - 执行上述操作而不保存中间文件
我熟悉这样的外壳管道:
tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z
本质上:
- 将整个文件夹合并为一个
tar
- 将数据传递
stdout
给stdin
压缩程序 - 申请挑衅的压缩
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
哪个调用gzip
(z
标志)来处理的。您还可以使用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
现在,首先您必须从目标主机执行此命令。以及需要解释的细节:
- ssh user@host 将打开与主机的连接,从主机传输数据。
- cd /path/to/data 将进入存储所需数据的目录
- tar zc * 将启动压缩并将其放入 STDOUT
- 现在,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/"