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
什么是源,什么是目标?我总是想知道复制发生在哪个方向。它是如何定义的?
Unix 命令几乎总是(极少数例外)在目标之前有源。如果这样做有意义的话,大多数人在最终目标之前允许多个来源。
这包括scp
.
一些命令(如的GNU版本cp
和mv
)有一个选项(如-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
有你可以用它来定义主机和主机组的任意群组的名称配置文件(例如all
,webservers
,dbservers
,gpunodes
,或其他)。然后您可以在pdsh
或pdcp
命令中使用它们:
pdsh -g all 'uname -a ; uptime'
pdcp -g webservers index.html /var/www/
Run Code Online (Sandbox Code Playgroud)
与for
上面的循环不同,它不运行命令或按顺序复制文件,一次一个主机。它并行运行多个命令,并根据您的机器拥有的 CPU 内核数量进行合理限制。
归档时间: |
|
查看次数: |
13508 次 |
最近记录: |