Shell 脚本用于 SSH 进入另一台服务器并在那里执行脚本

Shell 脚本用于 SSH 进入另一台服务器并在那里执行脚本

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

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

答案1

你应该结合两个相关的 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

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


登录时的附注:如果您有私钥,并且所有 6 台服务器都接受该私钥,只需添加 即可轻松登录-i ~/.ssh/id_rsa。另一种方法是创建一个~/.ssh/config包含每台主机的密钥/密码信息的文件。这在Lekensteyn 的回答。如果你不熟悉 SSH 密钥(我知道这是一个有点令人困惑的话题),你可能需要阅读ssh.com 上有关该主题的文章

答案2

您可以使用 sshpass:

sudo apt install sshpass -y 

然后你就可以在远程服务器上执行命令,例如

    #!/bin/bash
    # login info
    HOST='192.168.0.1'
    USER='user'
    PORT='2222'
    PASSWORD='password'
    # command
    sshpass -p $PASSWORD ssh -p $PORT $USER@$HOST touch 1.txt 

相关内容