通过 SSH 连接到另一台服务器并在那里执行脚本的 Shell 脚本

nit*_*thi 4 server ssh command-line bash scripts

我的测试环境中有 6 台服务器。我想编写一个脚本,通过登录一个盒子而不是每个盒子来停止所有盒子中的 Tomcat 服务器。

请帮助我编写 shell 脚本、SSH 并在所有其他框中执行脚本。我使用带有密码和自定义端口号的 SSH。

Ser*_*nyy 6

您应该将两个相关的 Ask Ubuntu 答案合并到一个脚本中,一个用于通过特定端口登录SSH,另一个用于在远程服务器上运行命令。当然,您需要有某种形式的数据结构来保存服务器+端口的对应关系。这可以是 bash关联数组,也可以是POSIX shell 脚本——一个 case 语句。假设您在所有主机上的用户名都相同,我们可以想出这样的事情:

#!/bin/sh
# bar host has ssh server on port 22, while baz - on port 2222
host_port(){
    case "$1" in
        "bar") echo 22 ;;
        "baz") echo 2222 ;;
    esac
} 

# set positional parameters of script to hosts and iterate over them
set -- bar baz
for host ; do
    # command substitution will call function, 
    # function's return value will be the port number
    ssh ssh://username@"$host":"$(host_port "$host")" -t "systemctl stop tomcat"
done
Run Code Online (Sandbox Code Playgroud)

现在,一个巨大的免责声明:这只是一个例子。我没有 6 台服务器来测试脚本,因此请根据需要对其进行调整。如果每个主机上的用户名不同,请使用其他case语句


关于登录的旁注:如果您有所有 6 个服务器都接受的私钥,只需添加-i ~/.ssh/id_rsa. 替代方法是~/.ssh/config为每个主机创建一个包含密钥/密码信息的文件。这在Lekensteyn 的回答有所描述。如果您不熟悉 SSH 密钥(我知道这是一个令人困惑的话题),您可能想阅读ssh.com 上有关该主题的文章