我有一个名为 script.sh 的脚本。我想在不同的机器上执行它,如host1、host2等。如何通过传递用户名和密码来循环每个服务器?
答案1
循环访问一堆没有密钥的服务器将需要循环访问包含明文或简单加密密码的文件。我强烈建议不要亲自这样做,尤其是在生产环境中。
警告 - 我不推荐这个
可以使用sshpass
和一个包含服务器主机名及其密码的文本文件来完成快速而肮脏的解决方案:
serverList.txt示例:
server1 password1
server2 password2
真的不安全脚本示例:
for host in $(awk '{print $1}' serverList.txt); do
password=$(grep -w "$host" serverList.txt | awk '{print $2}')
sshpass -p "$password" ssh $host < ./script.sh
done
这就是我的建议:
如果这是您需要定期执行的操作,我建议您研究一下dsh
(分布式 shell)。
安装
从 Debian/Ubuntu 安装它很简单:
sudo apt-get install dsh
对于基于 RHEL 的发行版,您必须libdshconfig
首先编译,然后dsh
:
# libdshconfig
wget http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.10.cvs.1.tar.gz
tar xfz libdshconfig*.tar.gz
cd libdshconfig-*
./configure ; make
make install
# dsh
wget http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.22.0.tar.gz
tar xfz dsh-0.22.0.tar.gz
cd dsh-*
./configure ; make
make install
配置
dsh
默认情况下,配置将rsh
用作登录协议。您可能希望将其更改ssh
为rsh
未加密的状态。
如果通过安装apt
,配置文件将为/etc/dsh/dsh.conf
- 如果您必须为基于 RHEL 的发行版编译它,则配置文件将为/usr/local/etc/dsh.conf
更新这个:
remoteshell =rsh
对此:
remoteshell =ssh
完成此操作后,您将需要一份要运行程序的机器列表。对于 debian,该文件为/etc/dsh/machines.list
,对于 RHEL 则为/usr/local/etc/dsh/machines.list
列表的格式可以是由换行符分隔的主机名、IP 或 FQDN。例如,machines.list
如果所有主机名或 FQDN 都解析,这将是一个有效文件:
10.20.30.40
10.20.30.31
server1.stackexchange.com
server2
root@myOtherServer
例子
此时,您现在可以在多个主机上顺序或并行运行命令machines.list
接下来,只有返回输出:
dsh -a <command>
$ dsh -a echo hello
hello
hello
将每个主机名作为其相应输出的前缀打印:
dsh -a -M <command>
$ dsh -a -M echo hello
root@server1: hello
root@server2: hello
执行相同的操作,但不是按顺序执行,而是同时运行命令:
dsh -aMc <command>
仅使用选定的主机:
dsh -Mc -m <host1> -m <host2> <command>
注意事项
因此,在您的场景中,问题在于您需要设置 ssh 密钥(除非您愿意输入每个主机的密码),并且您还需要每个主机上的脚本。
我个人认为,这将是最好、最安全的运行方式,具体取决于脚本的大小,因为您不必通过 ssh 为每个主机传递脚本,它们都可以在本地运行脚本。
答案2
答案3
使用ssh
它非常简单,大多数系统管理员总是使用它。假设本例中有 3 台远程主机和 1 台活动主机。主动的称为host1
,其他的称为host2
、host3
和host4
。并且每个主机上的用户名都是相同的user1
。
生成ssh密钥对(只需按 Enter 直到返回 shell):
user1@host1$ ssh-keygen -t rsa
部署公钥到host2
,host3
和host4
:
user1@host1$ for i in {2..4}; do ssh-copy-id user1@host$i;done
user1@host2 password:
user1@host3 password:
user1@host4 password:
传递脚本从host1
:
user1@host1$ for i in {2..4}; do scp script.sh user1@host$i:/home/user1 ;done
运行脚本从host1
:
user1@host1$ for i in {2..4}; do ssh user1@host$i 'sh script.sh'; done