我需要将目录复制到不同的服务器,这些服务器在文本文件(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
还有无数其他方法可以获取或生成服务器列表 - 例如,运行mysql
或psql
查询以从数据库中提取列表,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 密钥(否则它会要求每个服务器输入密码)。