如何循环登录多台服务器

如何循环登录多台服务器

我有一个名为 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用作登录协议。您可能希望将其更改sshrsh未加密的状态。

如果通过安装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

如果您想在多台机器上运行该脚本,那么您最好使用parallel,这个工具可以完全满足您的需求。

查看教程这里这里

答案3

使用ssh它非常简单,大多数系统管理员总是使用它。假设本例中有 3 台远程主机和 1 台活动主机。主动的称为host1,其他的称为host2host3host4。并且每个主机上的用户名都是相同的user1

生成ssh密钥对(只需按 Enter 直到返回 shell):

user1@host1$ ssh-keygen -t rsa

部署公钥host2,host3host4:

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

相关内容