scp 复制方向:什么是源,什么是目标?

rob*_*sch 4 scp

scp 的 man 概要是:

scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 。 .. [[用户@]host2:]file2

什么是源,什么是目标?我总是想知道复制发生在哪个方向。它是如何定义的?

cas*_*cas 8

Unix 命令几乎总是(少数例外)在目标之前有源。如果这样做有意义的话,大多数人在最终目标之前允许多个来源。

这包括scp.

一些命令(如的GNU版本cpmv)有一个选项(如-t--target-directory=DIRECTORY),让你先把目标-但默认是标准的“源(一个或多个)目标之前”。这非常有用,因此您可以在使用诸如 之类的东西时将目标放在源之前find ... -exec cp -t target/ {} +,或者这样您就可以避免使用-I {}with xargs(这要慢得多,它会导致xargs每个 arg 派生一个命令,而不是尽可能多地在每个命令行),例如... | xargs -0r mv -t target/代替... | xargs -0r -I {} mv {} target/

如果没有上述明确的覆盖选项,“目标在源之前”几乎是闻所未闻的 - 如此罕见以至于您完全有资格思考“嗯?WTF?” 如果你遇到过。


如果您需要一次将scp多个文件发送到多台机器,请在 for 循环中执行如下操作:

for h in host1 host2 host3... ; do
  scp file1 file2 file3... "user@$h:/path/"
done
Run Code Online (Sandbox Code Playgroud)

或者pdcp 从 Parallel Distributed Shell 使用pdsh为大多数 linux 发行版打包。

例如

pdcp -w host1,host2,host3 file1 file2 file3 /path/to/target/
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的例子,pdsh有你可以用它来定义主机和主机组的任意群组的名称配置文件(例如allwebserversdbserversgpunodes,或其他)。然后您可以在pdshpdcp命令中使用它们:

pdsh -g all 'uname -a ; uptime'
pdcp -g webservers index.html /var/www/
Run Code Online (Sandbox Code Playgroud)

for上面的循环不同,它不运行命令或按顺序复制文件,一次一个主机。它并行运行多个命令,并根据您的机器拥有的 CPU 内核数量进行合理限制。

  • 多个来源,是的。多个目标,没有。如果需要,可以使用不同的目标多次运行 `scp`(或使用类似 `pdsh` 中的 `pdcp`)。 (2认同)