命令行 shell script 到SSH到另一个服务器并在那里执行脚本

分享于 

3分钟阅读

ubuntu

  繁體 雙語

问题:

我的测试环境中有 6台服务器。 我想编写一个脚本,以便在所有框中停止Tomcat服务器,而不是登录到每个框中。

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


回答 1:

你应该结合两个相关的请求,一个用于通过特定端口登录,一个用于在远程服务器上运行命令,一个用于在远程服务器上运行命令,一个用于一个脚本。 当然,你需要有某种形式的数据结构来保存server+port通信。 这可能是 bash 关联数组或者带有 POSIX shell script - 一个案例语句。 假设你所有主机上的用户名相同,我们可以提供如下所示的内容:


#!/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 语句

登录时的副作用: 如果你有 private 密钥,那么所有 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'


 PASSWORD='password'


 # command


 sshpass -p $PASSWORD ssh $USER@$HOST 'touch 1.txt' 





COM  Server  COMM  Comma  命令行  EXE  
相关文章