是否可以编写一个接受输入的 shell 脚本,然后将 ssh 连接到服务器并在我的本地计算机上编写 运行 脚本?

Is it possible to write a shell script that takes input then will ssh into a server and run scripts on my local machine?

我的本地机器上有几个脚本。这些脚本 运行 安装和配置命令来设置我的 Elasticsearch 节点。我有 15 个节点即将到来,我们绝对不想手动完成。

现在,我们称它们为 Script_A、Script_B、Script_C 和 Script_D。

Script_A 将启动进程,它当前包含:

#!/bin/bash

read -p "Enter the hostname of the remote machine: " hostname
echo "Now connecting to $hostname!"

ssh root@$hostname

这显然工作正常,我可以进入我需要的任何服务器。我的困惑是 运行 远程连接其他脚本。我已经阅读了一些其他 articles/SO 问题,但我只是不理解其中的方法。

我的机器上会有一个目录如下:

Elasticsearch_Installation
|
|=> Scripts
    |
    |=> Script_A, Script_B, etc..

我可以 运行 Script_A 远程进入服务器,然后返回到我的本地并且 运行 Script_B 等等在远程服务器内没有移动文件?

如果有任何需要澄清的地方,请告诉我,一般来说,我对 Linux 环境还很陌生。更不用说 运行 通过网络从脚本进行远程安装了.

是的,你可以。在非交互模式下使用 ssh,就像在您的本地环境中启动命令一样。

ssh root@$hostname /remote/path/to/script

您的本地系统不会发生任何变化,您将处于启动 ssh 命令的同一位置。

注意: 这个命令会问你一个密码,如果你想要一个真正的非交互流程,设置主机无密码登录,就像这里解释的那样 How to ssh to localhost without password?

您遇到的问题不仅仅是设置 许多节点:您还必须关注所有这些节点的持续维护和管理。这是 Puppet、Ansible 等配置管理系统运行的 space。但这些都需要克服学习曲线,并且它们需要自己的一些基础设施。从中长期来看,您可能会从其中一个中受益,但如果您的新节点下周(大概)即将到来,那么您可能需要一个可以立即使用的解决方案。

当然,您可以通过 ssh 进入服务器以在那里执行 运行 命令,包括非交互方式。

My confusion is running the other scripts remotely.

当然,如果您想 运行 在远程机器上使用您自己的脚本,那么它们必须首先出现在远程机器上。但这不是主要问题,因为如果您有 ssh,那么您也有 scp,即安全复制程序。它可以将文件复制到远程机器,像这样:

#!/bin/bash

read -p "Enter the hostname of the remote machine: " hostname
echo "Now connecting to $hostname!"

scp Script_[ABCD] root@${hostname}:./
ssh root@hostname ./Script_A

我还管理 Elasticsearch 具有多个节点的集群。对我有用的一个 hack 是使用 Terminator 终端仿真器并将其拆分为多个 windows/panes,每个 ES 节点一个。然后你可以将你在一个 window 中键入的命令广播到所有 windows.

通过这种方式,您 运行 可以跨所有节点并行地几乎交互式地命令和查看它们的结果。你也可以把这个windows的布局保存在Terminator中,然后你可以通过快捷方式快速得到这个视图。

PS,这种方法只适用于你只有少量节点,而且也只适用于小任务。唯一会随着节点数量、次数和您需要执行的任务种类而扩展的可能是配置管理解决方案,例如 PuppetSalt .

Fabric 是另一个可能与您的用例相关的有趣项目。