可以scp
用来同时发送单个文件到多个远程服务器吗?如果是这样,怎么办?如果没有,还有什么选择?
答案1
pdcp
来自PDSH套餐是一种选择。 pdsh
是为了帮助管理 HPC 集群而编写的 - 我已经用它来管理 HPC 集群,我还用它来管理多个非集群机器。
pdsh
并pdcp
使用性别定义主机和主机组(“组”是您选择分配给主机的任意标签,主机可以具有任意数量的标签。)
例如,如果您有一个名为“webservers”的组,其中/etc/genders
包括 hostA、hostB、hostC,pdcp -g webservers myscript.sh /usr/local/bin
则将 myscript.sh 复制到所有三台主机上的 /usr/local/bin/ 中。
同样,pdsh -g all uname -r
将在 /etc/genders 中标记为“all”的每个主机上运行uname -r
,每个主机的输出都以主机名为前缀。
$ pdsh -g all uname -r
indra: 3.2.0-3-amd64
kali: 3.2.0-3-amd64
ganesh: 3.2.0-3-amd64
hanuman: 3.2.0-2-686-pae
pdsh 命令和 pdcp 副本并行执行(具有限制和超时,以防止原始系统过载)。
当运行的命令产生多行输出时,它可能会导致引号难以阅读。pdsh
包中的另一个程序dshbak
可以按主机名对输出进行分组,以便于阅读。
看到您的所有评论后,pdsh 和 pdcp 可能对您的需求来说有点过分了……它确实被设计为系统管理员的工具,而不是普通的非 root 用户的工具。
围绕 scp 编写一个简单的 shell 脚本包装器可能对您来说就足够了。例如,这是此类包装脚本的一个极其简单、简约的版本。
#! /bin/bash
# a better version would use a command line arg (e.g. -h) to get a
# comma-separated list of hostnames, but hard-coding it here illustrates
# the concept well enough.
HOSTS="[email protected] [email protected]"
# last argument is the target directory on the remote hosts
target_dir="$BASH_ARGV"
# all but the last arg are the files to copy
files=${@:1:$((${#@} - 1))}
for h in $HOSTS; do
scp $files "$h:$target_dir"
done
答案2
您可以同时多次读取文件,而不是同时将文件发送到多个目标。
将文件传输到 NFS,在目标上挂载该文件系统并将其从 NFS 复制到本地目标。
要手动并发执行此操作,您可以在目标上使用 cluster-ssh (cssh)。