如何将一个目录复制到一组服务器

如何将一个目录复制到一组服务器

我需要将目录复制到不同的服务器,这些服务器在文本文件(hostfile)中列出。

我还没有找到任何方法可以用 scp 做这样的事情

scp -r --hostfile ~/directory to_all@servers:~/

我知道如何为一台服务器执行此操作:scp -r directory one@server:~/,但不知道如何为许多服务器执行此操作。服务器的数量各不相同,但我对所有服务器使用相同的用户名。

答案1

最简单的方法是使用 shellfor循环。例如:

for s in server1 server2 server3 ... serverN ; do 
    scp -r directory/ $s:~/
done

一个小的变化是在文件中列出服务器(例如server-list.txt),每行一个,并执行如下操作:

for s in $(cat servers.txt) ; do 
    scp -r directory/ $s:~/
done

还有一个小变化支持文件#中的注释(包括注释掉服务器主机名)servers.txt

for s in $(sed -e 's/#.*//' servers.txt) ; do 
    scp -r directory/ $s:~/
done

还有无数其他方法可以获取或生成服务器列表 - 例如,运行mysqlpsql查询以从数据库中提取列表,text/plain从 Web 服务器获取文件,json从 Web 服务器获取文件并使用jq或解析它python -mjson.tool,还有很多。基本方法保持不变。


如果您需要经常对不同的文件/目录执行此操作和/或需要同时在多个服务器上并行运行 shell 命令,我强烈建议您安装PDSH打包并使用pdcp(并行分布式复制)和pdsh(并行分布式 shell)命令。 pdsh为大多数发行版打包。

在这里搜索pdsh- 有几个问题和答案提到了它。

答案2

while read server; do scp -r ~/directory to_all@$server: ; done < hostfile

假设您的远程用户是真的调用to_all,并假设您已经设置了 ssh 密钥(否则它会要求每个服务器输入密码)。

相关内容