在多台远程服务器上执行 BASH 脚本 您可以在命令行中运行的任何命令,都可以在 BASH 脚本中使用。脚本用于运行一系列命令。Bash 在 Linux 和 macOS 操作系统上默认可用。 让我们设想这样一个场景:您需要在多台远程服务器上执行一个 BASH 脚本,但又不想手动将脚本复制到每台服务器,然后再逐一登录到每台服务器并执行脚本。 当然,您可以使用 Ansible 等工具,但让我们先学习如何仅用 Bash 来完成这一任务! 前提条件 在这个示例中,我将使用部署在 DigitalOcean 上的 3 台远程 Ubuntu 服务器。如果您还没有 DigitalOcean 账户,可以通过此推荐链接注册 DigitalOcean 并获得 $100 免费额度: https://m.do.
您可以在命令行中运行的任何命令,都可以在 BASH 脚本中使用。脚本用于运行一系列命令。Bash 在 Linux 和 macOS 操作系统上默认可用。
让我们设想这样一个场景:您需要在多台远程服务器上执行一个 BASH 脚本,但又不想手动将脚本复制到每台服务器,然后再逐一登录到每台服务器并执行脚本。
当然,您可以使用 Ansible 等工具,但让我们先学习如何仅用 Bash 来完成这一任务!
在这个示例中,我将使用部署在 DigitalOcean 上的 3 台远程 Ubuntu 服务器。如果您还没有 DigitalOcean 账户,可以通过此推荐链接注册 DigitalOcean 并获得 $100 免费额度:
https://m.do.co/c/2a9bba940f39
准备好 DigitalOcean 账户后,继续部署 3 个 Droplet。
我已经创建了 3 台 Ubuntu 服务器:

我会把这些服务器的 IP 地址放入一个 servers.txt 文件中,以便在我们的 BASH 脚本中循环遍历这些 IP。
如果您是 DigitalOcean 的新手,可以按照以下步骤创建 Droplet:
您也可以通过此视频了解如何进行初始服务器设置:
或者更好的是,您可以参考这篇文章,了解如何使用 BASH 自动化初始服务器设置:
使用 BASH 自动化 Ubuntu 18.04 的初始服务器设置
现在我们已经准备好了这 3 台新服务器,接下来就可以专注于只用一条命令在所有服务器上运行我们的 BASH 脚本!
我将重用上一章中的演示脚本,并稍作修改。该脚本会简单地执行一些检查,例如当前内存使用情况、当前 CPU 使用情况、TCP 连接数以及内核版本。
#!/bin/bash ## # BASH script that checks the following: # - Memory usage # - CPU load # - Number of TCP connections # - Kernel version ## ## # Memory check ## server_name=$(hostname) function memory_check() { echo "#######" echo "The current memory usage on ${server_name} is: " free -h echo "#######" } function cpu_check() { echo "#######" echo "The current CPU load on ${server_name} is: " echo "" uptime echo "#######" } function tcp_check() { echo "#######" echo "Total TCP connections on ${server_name}: " echo "" cat /proc/net/tcp | wc -l echo "#######" } function kernel_check() { echo "#######" echo "The exact Kernel version on ${server_name} is: " echo "" uname -r echo "#######" } function all_checks() { memory_check cpu_check tcp_check kernel_check } all_checks
复制下面的代码,并将其保存到名为 remote_check.sh 的文件中。您也可以从 这里 获取该脚本。
现在脚本和服务器都已经准备就绪,并且我们已将这些服务器的 IP 地址添加到 servers.txt 文件中,我们可以运行以下命令来循环遍历所有服务器,并在远程执行脚本,而无需将脚本复制到每台服务器或逐个连接到每台服务器。
for server in $(cat servers.txt) ; do ssh your_user@${server} 'bash -s' < ./remote_check.sh ; done
这个 for 循环的作用是:它会遍历 servers.txt 文件中的每一台服务器,并为列表中的每个条目运行以下命令:
ssh your_user@the_server_ip 'bash -s' < ./remote_check.sh
您将得到如下输出:

这只是个非常简单的示例,说明如何在多台服务器上执行一个简单的脚本,而无需将脚本复制到每台服务器,也无需单独访问每台服务器。
当然,您也可以运行更复杂的脚本,并在更多服务器上执行。
如果您对自动化感兴趣,我建议您查看 DigitalOcean 网站上的 Ansible 资源页面:
{notice} 此内容最初发布在 DevDojo 上。
免责声明:
本文件由基于人工智能的机器翻译服务翻译而成。尽管我们力求翻译准确,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言版本的文件为准。对于关键信息,建议采用专业的人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。