使用ssh client与bash scripts轻松管理多台主机
当我们需要控制一个局域网中的很多台服务器时,一个简单的全局操作可能会被放大地异常繁琐,这时我们就会需要新的工具来快速完成这种工作。
我们将使用ssh客户端提供的一些工具来快速完成这一开发工作,我们的开发平台是GNU/Linux。
下面即是我们整个系统的鸟瞰图:

第一个工具:
要建立非交互式的ssh连接,采用客户端公钥认证登录的方式是一种很棒的方法。
第一个工具的功能是,将本地ssh客户端的公钥追加到各SlaveServers的/root/.ssh/authorized_keys文件中,以实现ssh公钥登录的认证。
具体实现如下:
SlaveServer.conf
1 #global var: glServerList
2 glServerList="192.168.31.98 \
3 192.168.31.3 \
4 192.168.31.4 \
5 192.168.31.5 \
6 192.168.31.6"
RSAPublicKeyBroadCast.sh
1 #!/bin/bash
2
3 . SlaveServer.conf
4
5 function SSH_RSAPublicKeyBroadCast () {
6 # $1 : sshd port like : 3198
7 ssh-keygen
8 declare RSApk_path=/root/.ssh/id_rsa.pub
9 declare clientRSApk=`cat ${RSApk_path}`
10 declare i
11 for i in $glServerList
12 do
13 echo "communicating via ssh with $i ... ..."
14 ssh -o GSSAPIAuthentication=no -p "$1" root@${i} "mkdir ~/.ssh ; echo ${clientRSApk} >> ~/.ssh/authorized_keys"
15 done
16 }
17 SSH_RSAPublicKeyBroadCast "$1"
其使用、验证请看附录。
第二个工具:
当我们需要将一个本地文件传送到所有SlaveServer的一个相同路径时,我们便需要一个工具来完成这样的任务。
例如:当我们想统一调整所有SlaveServer的sshd服务的参数时,我们需要改变所有SlaveServer上的/etc/ssh/sshd_config文件,这时第二个工具将发挥它的威力。
具体实现如下:
FileBroadCast.sh
1 #!/bin/bash
2
3 . SlaveServer.conf
4
5 function SSH_FileBroadCast () {
6 # $1 : sshd port like : 3198
7 # $2 : src :local file path like /etc/ssh/sshd_config
8 # $3 : dest: remote server file path like /etc/ssh/sshd_config
9 declare i
10 for i in $glServerList
11 do
12 echo "communicating via ssh with $i ... ..."
13 scp -o GSSAPIAuthentication=no -P "$1" "$2" root@${i}:${3}
14 done
15 }
16
17 SSH_FileBroadCast "$1" "$2" "$3"
其使用、验证请看附录。
第三个工具:
在完成第二个工具后,我们有了向所有SlaveServer传送文件的能力,但是,如何向其所有发送"service sshd reload"命令呢?
于是,我们的第三个工具,CommandBroadCast入场。
具体实现如下:
CommandBroadCast.sh
1 #!/bin/bash
2
3 . SlaveServer.conf
4
5 function SSH_CommandBroadCast () {
6 # $1 : sshd port like : 3198
7 # $2 : command like ' service sshd reload '
8 declare i
9 for i in $glServerList
10 do
11 echo "communicating via ssh with $i ... ..."
12 ssh -o GSSAPIAuthentication=no -p "$1" root@${i} "${2}"
13 done
14 }
15
16 SSH_CommandBroadCast "$1" "$2"
其使用、验证请看附录。
第四个工具:
第三个工具可以让我们控制所有的SlaveServer执行我们指定的一段命令,但是,如果我们想让它们执行本地的一个bash脚本呢?
如此,第四个工具的功能是命令所有SlaveServer执行我们在本地定义的一个bash脚本文件。
具体实现如下:
AllSlaveExecLocalScripts.sh
#!/bin/bash
. SlaveServer.conf
function SSH_RemoteServerExecLocalScripts () {
# $1 remoteServerArgs like: root@192.168.31.2
# $2 remoteServer SSH Daemon's port like: 3198
# $3 local bash scripts you want the remoteServer to exec
declare tempFile=`mktemp` #local tmp
declare remoteTmpDir
if ssh -o GSSAPIAuthentication=no -p "$2" "$1" 'declare tempDir=`mktemp -d` ; chmod 700 $tempDir ;
chown root:root $tempDir ; cd $tempDir ; unset tempDir ; pwd ' 1> $tempFile
then
remoteTmpDir=`tail -1 $tempFile`
scp -o GSSAPIAuthentication=no -P "$2" "$3" ${1}:$remoteTmpDir 1>/dev/null
ssh -o GSSAPIAuthentication=no -p "$2" "$1" " bash ${remoteTmpDir}/* ; rm -fr ${remoteTmpDir} "
rm -f $tempFile
return 0
else
rm -f $tempFile
echo "connect error:exit"
return 1
fi
}
function SSH_BroadCastExecLocalScripts () {
# $1 : sshd port like : 3198
# $2 local bash scripts you want the remoteServer to exec
declare i
for i in $glServerList
do
echo "communicating via ssh with $i ... ..."
SSH_RemoteServerExecLocalScripts "$i" "$1" "$2"
done
}
SSH_BroadCastExecLocalScripts "$1" "$2"
至此,我们的四个工具已经开发完成,接下来请看附录中的实验展示。
附录:
关于实验环境的配置情况,请查看文章《构建一个完整的DNS系统》,这里不再赘述。

1.控制所有SlaveServer对192.168.31.2主机进行ssh公钥登录认证:

2.由于SlaveServer们的sshd参数设置问题,导致ssh登录连接的建立“异常”缓慢,所以我们需要重新调整所有SlaveServer的sshd配置文件:

3.向所有SlaveServer发送'service sshd reload'命令:

4.命令所有SlaveServer执行本地主机192.168.31.2上的一个脚本:
ip_host.sh
1 #!/bin/bash
2
3 declare host_ip=`ifconfig | grep -Eo 'inet addr:\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\>' | grep -Eo '\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\>' | head -1`
4
5 echo "host ip is : $host_ip"
6
7 mpstat

至此,我们的工具实验展示结束。如有问题或建议,欢迎讨论 :)
使用ssh client与bash scripts轻松管理多台主机的更多相关文章
- CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机
使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...
- Windows 上的 SSH?使用 PowerShell Remoting 远程管理 Windows 服务器
作者:陈计节 个人博客:https://blog.jijiechen.com/post/powershell-remoting/ 在 Linux/Unix 世界里 SSH 是个好东西,SSH 是 Se ...
- TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...
- Android手机SSH Client客户端推荐JuiceSSH
Windows上建立ssh服务器 参见: http://www.cnblogs.com/xred/archive/2012/04/21/2461627.html Android手机SSH Client ...
- 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
[转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...
- 灵活使用ssh、dsh和pssh高效管理大量计算机
http://os.iyunv.com/art/201012/240113.htm 灵活使用ssh.dsh和pssh高效管理大量计算机 http://os.iyunv.com2010-12-23 09 ...
- [异常解决] windows用SSH和linux同步文件&linux开启SSH&ssh client 报 algorithm negotiation failed的解决方法之一
1.安装.配置与启动 SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有 ...
- centos 7安装mysql报错-bash: ./scripts/mysql_install_db: /usr/bin/perl: bad interpreter: No such file or directory
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql -bash: ./scripts/mysql_install_db: ...
- 好用的SSH客户端 good SSH client recommended
对于经常性地要登录服务器的同志们,选择一款优秀的SSH客户端非常有必要,不仅可以提高效率,而且赏心悦目,宅的几率更大.呵呵,我就是i一枚.很出名的就是PuTTY(Windows,Linux都有的), ...
随机推荐
- 《selenium2 python 自动化测试实战》(17)——几个cookies操作
之前我们已经学过利用cookies跳过验证码登录了,那时候我们用的方法是add_cookie()方法,这里再给大家介绍两个,一般情况下我们用不到,了解一下就可以,而且如果真的用到的时候百度也很快的: ...
- 开发中常见的ES6语句
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 解决js代码中加入alert()就成功执行,不加就不对的问题!
问题: jquery中的$(document).ready(function(){})中调用两个方法(1)利用ajax请求去后台查图书类别的方法(2)当页面上利用图书类别去查询图书返回页面,让图书类别 ...
- hdu4261 Estimation[暴力dp+对顶堆]
https://vjudge.net/problem/HDU-4261 对于一个长2000的数列划分最多25个块,每块代价为块内每个数与块内中位数差的绝对值之和,求最小总代价. 套路化地,设$f[i] ...
- WebBrower使用 Http 代理访问网页
public struct Struct_INTERNET_PROXY_INFO { public int dwAccessType; public IntPtr proxy; public IntP ...
- normalizr api 转换类库使用
1. 项目初始化 yarn init yarn add normalizr 项目结构 app.js package.json user.json 2. 使用 a. app.js const userj ...
- 异常处理—Exception(二)
在上一篇中"异常处理--Exception(一)"中,跟大家简单介绍了一下Exception,也使大家充分的了解了Exception管理在一个项目中的重要性,那如何在我们的项目中处 ...
- c++中重载,重写,覆盖
1.重载 重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 相同的范围(在 ...
- C# WMP 视频播放
1. C#播放器控件常用的方法介绍 右击工具箱->选择项(I)... -> 显示"选择工具箱项" -> COM组件 -> Windows Media Pla ...
- SpringMVC之八:基于SpringMVC拦截器和注解实现controller中访问权限控制
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...