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

How to copy multiple files simultaneously using scp

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

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

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

100mbit 以太网实际上很慢。理论上你可以期待 8 MiB/s。实际上,您通常最多只能得到 4-6 MiB/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 压缩效果更好但更慢。这就是为什么我使用 gzip (z) 来完成这样的任务。

如果您指定多个文件,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 . &

SSH 能够执行所谓的 "multiplexing" - 通过一台(到一台服务器)建立更多连接。这可能是一种买得起你想要的东西的方式。查找关键字,例如 "ControlMaster"

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

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

但是,这就是您问题的答案 - "How to copy multiple files simultaneously"。为了加快速度,您可以使用较弱的加密(rc4 等)并且不要忘记,瓶颈可能是您的硬盘 - 因为 SCP 不会隐式限制传输速度。

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

我不确定这是否对你有帮助,但我通常在源头压缩(不需要压缩。只是存档就足够了)文件,下载它,解压它们。这将显着加快该过程。 在存档之前,下载 1GB 需要 > 8 小时 归档后完成同样的操作需要不到 8 分钟

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

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

此致,

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

#!/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"