如何使用scp同时复制多个文件

8
我想同时复制多个文件以加快我的操作流程,当前我使用以下方法:
scp -r root@xxx.xxx.xx.xx:/var/www/example/example.example.com .

但是它一次只能复制一个文件。我有100 Mbps光纤,所以我有足够的带宽可以同时复制很多文件,请帮忙。


"100兆光纤"是什么意思?是指100兆比特以太网还是10千兆比特以太网? - Aaron Digulla
脚本化它!在每个命令的末尾加上&以将其发送到后台,或查看GNU Parallel。 - Fredrik Pihl
@AaronDigulla 抱歉,我想说的是100兆比特以太网。 - Philip
@FredrikPihl,我不确定我理解你的意思,请你详细说明一下吗? - Philip
6个回答

9
你可以使用等待命令来执行后台任务。 等待命令确保在处理下一行之前,所有的后台任务都已经完成。也就是说,在三个节点的scp操作完成后,echo命令才会被执行。
#!/bin/bash
scp -i anuruddha.pem myfile1.tar centos@192.168.30.79:/tmp &
scp -i anuruddha.pem myfile2.tar centos@192.168.30.80:/tmp &
scp -i anuruddha.pem myfile.tar centos@192.168.30.81:/tmp &

wait
echo "SCP completed"

这只会将同一文件复制多次。 - Jake Sylvestre

7
SSH可以实现所谓的“多路复用”——在一台服务器上使用更多的连接。它可以是实现你想要的一种方法之一。搜索关键词如“ControlMaster”。
第二种方式是使用更多的连接,然后将每个作业发送到后台。
for file in file1 file2 file3 ; do 
     scp $file server:/tmp/ & 
done

但是,这是回答你的问题 - "如何同时复制多个文件"。为了加快速度,您可以使用较弱的加密(rc4等),还要记住,瓶颈可能是您的硬盘 - 因为SCP不会隐式限制传输速度。

最后一个要点是使用rsync - 在某些情况下,它比scp更快...


S,你说的完全正确,但我不仅仅是尝试一次性访问几个大文件。我正在尝试下载总共约10,000个小图像。 - Philip
4
最好的方法是创建一个归档文件(tar),可能压缩它(gzip),然后进行传输并执行相反的操作。 - Mike S.
谢谢你,Mike。我认为这是最好的解决方案。非常感谢! - Philip
4
最快的方法就是像这样:ssh source.machine "tar czpf - /lot/of/data" | tar xzpf - -C /tmp - Mike S.
@rogerdpack:你好,请看 https://dev59.com/TX3aa4cB1Zd3GeqPfp5P - Mike S.

4

我不确定这是否对您有帮助,但我通常在源端存档(不需要压缩,只需存档即可),然后下载并解压文件。这将显著加快过程速度。 在进行存档之前,1GB 文件下载需要 > 8 小时 存档之后,同样的文件下载只需要 < 8 分钟。


3

请提供以下与编程相关的内容的中文翻译。仅返回翻译后的文字内容:请简要回答,并附上链接。翻译结果:提供简要细节及链接。 - soumya

2

100mbit以太网的速度实际上相当慢。理论上可以期望8MiB/s的速度,但在实践中,你通常最多只能获得4-6MiB/s。

即便是同时运行多个会话,你也不会看到速度提升。你可以自己尝试一下,运行两个并行的SCP会话来复制两个大文件。我猜你不会看到明显的加速效果。造成这种情况的原因有:

  1. 在两台计算机之间的网络路径上,速度最慢的组件决定了最大速度。
  2. 其他人可能同时在访问example.com,减少了它可以给你的带宽。
  3. 100Mbit以太网要求两个连续网络数据包之间有相当大的间隔。而千兆以太网在这方面表现更好。

解决方法:

  1. 在发送数据之前对其进行压缩。
  2. 使用像rsync这样的工具(底层使用SSH)来复制自上次运行该命令以来发生更改的文件。
  3. 创建大量小文件需要很长时间。尝试在远程端创建一个所有文件的存档,并将其作为单个存档发送。

可以通过以下方式来执行最后一个建议:

ssh root@xxx "cd /var/www/example ; tar cf - example.example.com" > example.com.tar

或者使用压缩:

ssh root@xxx "cd /var/www/example ; tar czf - example.example.com" > example.com.tar.gz

注意:bzip2 压缩效果更好但速度较慢。因此我在像这样的任务中使用gzipz)。

在我的情况下,这些文件并不大,大约有10,000张图片,每张图片大小在30-60kb之间。因此,如果我同时下载至少10个文件,它不会拖慢我的连接,如果我没记错的话?我从服务器上下载的图片或文件没有一个超过100kb。另外,当我运行两个SCP会话时,它们会下载相同的文件并互相覆盖。 - Philip
1
我知道这是一个相当老的问题,但正如@Philip所建议的那样,传输速度与可用带宽无关,简单的tar将使事情快得多,使用的数据量和带宽将大致相同,但传输速度将会很快。 - ThomasRedstone

0

如果您指定多个文件,scp 将按顺序下载它们:

scp -r root@xxx.xxx.xx.xx:/var/www/example/file1 root@xxx.xxx.xx.xx:/var/www/example/file2 .

或者,如果您希望文件并行下载,则使用多个scp调用,并将每个调用放在后台。

#! /usr/bin/env bash
scp root@xxx.xxx.xx.xx:/var/www/example/file1 . &
scp root@xxx.xxx.xx.xx:/var/www/example/file2 . &

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接