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

时间:2015-01-19 12:55:19

标签: linux scp

我想同时复制多个文件以加快我目前使用以下

的流程
scp -r root@xxx.xxx.xx.xx:/var/www/example/example.example.com .

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

6 个答案:

答案 0 :(得分:5)

您可以将后台任务与wait命令一起使用。 Wait命令确保在处理下一行之前完成所有后台任务。即所有三个节点的scp完成后,将执行echo。

#!/bin/bash
scp -i anuruddha.pem myfile.tar centos@192.168.30.79:/tmp &
scp -i anuruddha.pem myfile.tar centos@192.168.30.80:/tmp &
scp -i anuruddha.pem myfile.tar centos@192.168.30.81:/tmp &

wait
echo "SCP completed"

答案 1 :(得分:4)

SSH可以做所谓的"多路复用" - 一个(一个服务器)的更多连接。它可以是一种提供你想要的东西的方式。查找" ControlMaster"

等关键字

第二种方式是使用更多连接,然后在后台发送每个工作:

for file in file1 file2 file3 ; do 
     scp $file server:/tmp/ & 
done

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

最后一件事是使用rsync - 在某些情况下,它可能比scp快很多......

答案 2 :(得分:3)

我不确定这是否对您有所帮助,但我通常归档(压缩不是必需的。只需归档就足够了)源文件,下载它,提取它们。这将显着加快这一过程。 在归档之前,花了> 8小时下载1GB 归档后,它花了< 8分钟做同样的事情

答案 3 :(得分:1)

实际上,100mbit以太网非常慢。理论上你可以期望8 MiB / s。在实践中,你通常最多可以达到4-6 MiB / s。

那就是说,如果你并行运行多个会话,你就不会看到提速。您可以自己尝试,只需运行两个并行的SCP会话复制两个大文件。我的猜测是你没有看到明显的加速。原因是:

  1. 两台计算机之间网络路径上最慢的组件确定最大值。速度。
  2. 其他人可能会同时访问example.com,从而减少了可以提供给您的带宽
  3. 100mbit以太网在两个连续的网络数据包之间需要相当大的间隙。 GBit以太网在这方面要好得多。
  4. 解决方案:

    1. 通过电线发送之前压缩数据
    2. 使用像rsync这样的工具(在引擎盖下使用SSH)复制自上次运行命令以来已更改的文件。
    3. 创建大量小文件需要花费大量时间。尝试创建远程端所有文件的存档,并将其作为单个存档发送。
    4. 最后一个建议可以这样做:

      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)执行此类任务的原因。

答案 4 :(得分:1)

您可以使用parallel-scp(AKA pscp):http://manpages.ubuntu.com/manpages/natty/man1/parallel-scp.1.html

使用此工具,您可以同时将文件(或文件)复制到多个主机。

此致

答案 5 :(得分: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 . &