scp 的 man 简介是:
scp [-1246BCpqrv] [-c 密码] [-F ssh_config] [-i 身份文件] [-l 限制] [-o ssh_option] [-P 端口] [-S 程序] [[user@]host1:]file1 。 .. [[用户@]主机2:]文件2
什么是源,什么是目标?我总是想知道复制发生在哪个方向。它是如何定义的?
答案1
Unix 命令几乎总是(带有非常少数例外)源在目标之前。如果有意义的话,大多数都允许在最终目标之前使用多个来源。
包括scp
。
某些命令(例如 GNU 版本的cp
和mv
)有一个选项(例如-t
或--target-directory=DIRECTORY
),允许您将目标放在第一位 -但默认是标准的“源在目标之前”。这非常有用,因此您可以在使用类似 之类的东西时将目标放在源之前find ... -exec cp -t target/ {} +
,或者这样您就可以避免使用-I {}
with xargs
(这要慢得多,它会导致xargs
每个参数分叉一个命令,而不是在每个参数上容纳尽可能多的命令命令行),例如... | 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
或者使用pdcp
来自并行分布式 Shell。 pdsh
为大多数 Linux 发行版打包。
例如
pdcp -w host1,host2,host3 file1 file2 file3 /path/to/target/
这是一个非常简单的示例,有一个配置文件,您可以使用它来定义具有任意组名称(例如、、、或其他名称)pdsh
的主机和主机组。然后您可以在或命令中使用它们:all
webservers
dbservers
gpunodes
pdsh
pdcp
pdsh -g all 'uname -a ; uptime'
pdcp -g webservers index.html /var/www/
与上面的循环不同for
,它不会运行命令或按顺序复制文件,一次一台主机。它并行运行多个命令,并根据计算机拥有的 CPU 核心数量进行合理的限制。
答案2
通过该scp
命令,您可以指定来源(要复制的文件或目录)和目标(复制文件或目录的位置)。的语法scp
是:
如果您正在使用要将文件发送到远程计算机的计算机:
scp /file/to/send username@remote:/where/to/put
这里remote
可以是 FQDN 或 IP 地址。
另一方面,如果您在计算机上想要从远程计算机接收文件:
scp username@remote:/file/to/send /where/to/put
答案3
你可以从部分推断出来...
。
您可以复制多个源文件,但只能复制到一个目标。这...
意味着您可以在此位置指定其他文件。由于 是...
在 后直接给出的file1
,因此这一定是来源。
示例:scp fileA fileB fileC
将fileA
和复制fileB
到fileC
。