我的测试环境中有 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