17611538698
webmaster@21cto.com

使用 SSH 在多个服务器上运行统一命令

运维 0 627 2024-03-28 08:01:49

图片

对于Linux系统,会有无数条路线可以到达同一个地方。这就是该操作系统有优势的一部分:而如何从 A 点到达 B 点取决于我们自己。

这也可以将其视为操作系统的“Mad Libs”(写作游戏)。

以在远程计算机上运行命令的能力为例。有很多选择,例如Red Hat Ansible、Puppet 和 Chef,它们都是令人称赞的系统平台,但对于我们的需求来说可能有点大材小用。

请考虑一个场景:你有一个工作站和需要管理的 5 或 10 台服务器。你可以在每台服务器中工作并使用 Secure Shell,运行必要的命令,退出服务器,然后冲洗、清洗并重复,直到处理完所有内容为止。

这非常耗时并且可能会导致一些问题。想象一下,如果你在错误的机器上运行了错误的命令。

是的,你并不想要这样。你还希望尽可能地简化,这就是为什么这个方便的 SSH 技巧可以让生活变得更轻松。

假设你有许多Ubuntu 服务器和 Rocky Linux服务器,你希望确保每台服务器始终是最新的。正如我之前提到的,你可以登录每个 Ubuntu 服务器并发出命令:

sudo apt-get update && sudo apt-get upgrade -y

然后,你就可以登录每个 Rocky Linux 服务器,并且发出如下命令:

sudo dnf update -y

这可能需要比您可能需要的时间多一点的时间。那么,我们如何让Secure Shell ( SSH ) 为我们完成繁重的工作呢?感谢SSH配置文件,这实际上相当简单。

让我告诉大家怎么做。

创建 SSH 配置文件

我们要做的第一件事是创建一个 SSH 配置文件。我们将继续使用Ubuntu 和 Rocky Linux 服务器的示例。

请使用以下命令创建配置文件:

nano ~/.ssh/config

请记住,你需要以运行该命令的用户身份创建该文件。我们将在此文件中创建四个条目(可以根据需要创建任意多个条目)——两个用于 Ubuntu 服务器,两个用于 Rocky Linux 服务器。包含以下信息:

ubuntu-web 在 192.168.1.100ubuntu-db 在 192.168.1.101rocky-web 在 192.168.1.102rocky-db 在 192.168.1.103

这些主机名称可以是你喜欢的任何名称,但重要的是名字是以 Ubuntu 或 Rocky 开头。配置条目将如下所示:

Host ubuntu-web
Hostname 192.168.1.100
Host ubuntu-db
Hostname 192.168.1.101
Host rocky-web
Hostname 192.168.1.102
Host rocky-db
Hostname 192.168.1.103


保存并关闭文件。

接下来,我们需要创建两个脚本,它们将接受用户的输入以便运行命令,从配置文件中获取主机,测试命令运行是否需要 sudo 权限,然后循环主机以执行命令。

使用以下命令创建第一个脚本:

nano ~/ubuntu-cmd

你可以将该文件命名为任何想要的名称。在该文件中,粘贴以下内容:

#!/bin/bash
# Get the user's input for the command
[[ -z ${@} ]] && exit || CMD_EXEC="${@}"
# Locate the hosts from ~/.ssh/config with Host entries that are prefixed by `ubuntu-`
HOSTS=$(grep -Po 'Host\s\Kubuntu-.*' "$HOME/.ssh/config")
# Test for a sudo requirement
if [[ $CMD_EXEC =~ ^sudo ]]
then
# Ask for the sudo password
read -sp '[sudo] password for remote_admin: ' password; echo
# Rewrite the command as needed
CMD_EXEC=$(sed "s/^sudo/echo '$password' | sudo -S/" <<< "$CMD_EXEC")
fi
# Iterate through the hosts and execute the SSH command, remove `-a` to override ">"
while IFS= read -r host
do
echo -e '\n\033[1;33m'"HOST: ${host}"'\033[0m'
ssh -n "$host" "$CMD_EXEC >&" | tee -a "/tmp/$(basename "${0}").${host}."
done <<< "$HOSTS"

保存并关闭文件。

接下来,我们将把脚本移动到/usr/local/bin:

sudo mv ubuntu-cmd /usr/local/bin

在该文件中,粘贴以下内容:

#!/bin/bash
# Get the user's input for the command
[[ -z ${@} ]] && exit || CMD_EXEC="${@}"
# Get the hosts from ~/.ssh/config whose names are prefixed by `rocky-`
HOSTS=$(grep -Po 'Host\s\Krocky-.*' "$HOME/.ssh/config")
# Test for a sudo requirement
if [[ $CMD_EXEC =~ ^sudo ]]
then
# Ask for the sudo password
read -sp '[sudo] password for remote_admin: ' password; echo
# Rewrite the command as needed
CMD_EXEC=$(sed "s/^sudo/echo '$password' | sudo -S/" <<< "$CMD_EXEC")
fi
# iterate through the hosts and execute the SSH command, remove `-a` to override >
while IFS= read -r host
do
echo -e '\n\033[1;33m'"HOST: ${host}"'\033[0m'


ssh -n "$host" "$CMD_EXEC >&" | tee -a "/tmp/$(basename "${0}").${host}."


done <<< "$HOSTS"


接下来,我们将把脚本移动到 /usr/local/bin :

sudo mv ubuntu-cmd /usr/local/bin
sudo mv rocky-cmd /usr/local/bin


接下来,更改脚本的所有权:

sudo chown $USER /usr/local/bin/ubuntu-cmd
sudo chown $USER /usr/local/bin/rocky-cmd


最后,赋予文件可执行权限:

sudo chmod u+x /usr/local/bin/ubuntu-cmd
sudo chmod u+x /usr/local/bin/rocky-cmd


如何使用脚本

假设想要将sudo apt-get update && sudo apt-get upload -y命令发送到Ubuntu 服务器。可以发出以下命令:

ubuntu-cmd sudo apt-get update && sudo apt-get upgrade -y

系统会提示我们在远程计算机上输入 sudo 密码,一旦成功通过身份验证,它将运行命令,然后迭代到下一个主机。

然后,你可以对 Rocky 主机执行相同的操作,如下所示:

rocky-cmd sudo dnf update -y

同样,它将遍历所有配置的主机,并在每个主机上运行命令。

祝贺各位!你刚刚让 Linux 服务器管理生活变得更加轻松,而不必依赖更复杂的第三方平台来完成繁重的工作了~

评论