无法在多台 Linux 机器上执行多个命令?

无法在多台 Linux 机器上执行多个命令?

我有大约 50 台 ubuntu 机器,我需要在它们上运行以下命令:

sudo apt-get install htop
sudo scp -r [email protected]:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r [email protected]:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp [email protected]:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core

因此,我使用上述命令创建了一个 shell 脚本文件,commands.sh并创建了另一个名为 的文件,machines.text其中包含所有 50 台计算机。

我的机器列表位于此文件中machines.text

somemachineA
somemachineB

我的命令在这个文件中commands.sh

#!/bin/bash
sudo apt-get install htop
sudo scp -r [email protected]:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r [email protected]:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp [email protected]:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core

我有一个这样的脚本execute.sh,我正在这样运行./execute.sh machines.txt

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "###################################################"
    echo "Machine Name: $line"
    scp commands.sh $line:/tmp/commands.sh
    ssh -t $line 'script /dev/null . /tmp/commands.sh'
    echo "###################################################"
done < "$1"

运行上面之后,我看到下面的错误,并且它没有执行以下命令中的任何命令somemachineA

todd@testMachine:~$ ./execute.sh machines.text
###################################################
Machine Name: somemachineA
todd@somemachineA's password:
commands.sh                                                                                                                                                                                                100%  104     0.1KB/s   00:00
Pseudo-terminal will not be allocated because stdin is not a terminal.
todd@somemachineA's password:
Script started, file is /dev/null
Script done, file is /dev/null
todd@somemachineA:/home/todd$ somemachineB: command not found

我做错了什么以及如何在多台 Linux 机器上执行多个 linux 命令?

答案1

尝试更换

ssh -t $line 'script /dev/null . /tmp/commands.sh'

经过

ssh  $line 'bash /tmp/commands.sh'
  • 你正在编写脚本到 /dev/null 吗?
  • 如果您以交互方式执行命令,则将分配 tty。

答案2

有多种工具可用于执行您想要的操作。我最喜欢的是PDSH,其中包括pdcp(多主机 scp)、pdsh(多主机 ssh)和dshbak(显示按主机分组的多主机输出) -dshbak非常有用,因为 pdsh 在多个主机上并行执行命令,而不是一个接一个地执行命令。我曾在集群、虚拟机、云服务器以及小型和大型物理机组上多次使用 pdsh。它能很好地完成工作并且易于设置。

pdsh 可以为大多数发行版提供预打包。

要使用它,您需要创建一个主机文件(默认情况下为 /etc/genders),其中包含主机名和它们所属的“组”名称的逗号分隔列表。每台主机可以属于一个或多个组 - 例如,某些主机可能位于组“webserver”中,某些主机可能位于组“dbserver”中,而所有主机可能位于组“all”中。例如:

somemachineA all
somemachineB all

然后,您可以使用 pdcp 将脚本复制到组“all”中的所有主机:

pdcp -g all commands.sh /tmp/

(注意:远程主机上的 /tmp 必须使用 exec privs 挂载 - 大多数文件系统的默认设置,但出于安全目的,以 noexec 挂载 /tmp 并不罕见。在这种情况下,要么将脚本 pdcp 到其他地方,要么调用它与,例如,bash /tmp/commands.sh而不仅仅是/tmp/commands.sh?)

然后在所有主机上执行脚本:

pdsh -g all /tmp/commands.sh >& /tmp/commands.log

(注意:这假设所有主机上都配置了 ssh 进行无密码登录,即使用 ssh 密钥而不是密码。如果不是这种情况,最好不要将输出重定向到日志文件,因为会使交互式使用变得困难。您确实应该配置远程主机以进行 ssh 密钥访问,然后禁用密码登录)

完成后您可以使用 dshbak 查看日志:

dshbak /tmp/commands.log | less

最后,关于 pdsh 等需要了解的一件有用的事情是,默认情况下,它将尝试使用 rsh 而不是 ssh。我不知道为什么,因为没有人再使用 rsh...不过,它很容易修复,只需创建一个名为 的文件/etc/pdsh/rcmd_default并添加一行仅包含ssh.

相关内容