对于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.100
ubuntu-db 在 192.168.1.101
rocky-web 在 192.168.1.102
rocky-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 服务器管理生活变得更加轻松,而不必依赖更复杂的第三方平台来完成繁重的工作了~
本文为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。