slot deposit pulsa slot mahjong slot gacor slot gacor slot gacor resmi slot gacor 2025 slot gacor terpercaya slot gacor 2025 slot gacor hari ini slot gacor hari ini slot gacor hari ini
使用 SSH 在多个服务器上运行统一命令
17611538698
webmaster@21cto.com

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

运维 0 1015 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 服务器管理生活变得更加轻松,而不必依赖更复杂的第三方平台来完成繁重的工作了~

评论