当我们需要控制一个局域网中的很多台服务器时,一个简单的全局操作可能会被放大地异常繁琐,这时我们就会需要新的工具来快速完成这种工作。

我们将使用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轻松管理多台主机的更多相关文章

  1. CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机

    使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...

  2. Windows 上的 SSH?使用 PowerShell Remoting 远程管理 Windows 服务器

    作者:陈计节 个人博客:https://blog.jijiechen.com/post/powershell-remoting/ 在 Linux/Unix 世界里 SSH 是个好东西,SSH 是 Se ...

  3. TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...

  4. Android手机SSH Client客户端推荐JuiceSSH

    Windows上建立ssh服务器 参见: http://www.cnblogs.com/xred/archive/2012/04/21/2461627.html Android手机SSH Client ...

  5. 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    [转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...

  6. 灵活使用ssh、dsh和pssh高效管理大量计算机

    http://os.iyunv.com/art/201012/240113.htm 灵活使用ssh.dsh和pssh高效管理大量计算机 http://os.iyunv.com2010-12-23 09 ...

  7. [异常解决] windows用SSH和linux同步文件&linux开启SSH&ssh client 报 algorithm negotiation failed的解决方法之一

    1.安装.配置与启动 SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有 ...

  8. 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: ...

  9. 好用的SSH客户端 good SSH client recommended

    对于经常性地要登录服务器的同志们,选择一款优秀的SSH客户端非常有必要,不仅可以提高效率,而且赏心悦目,宅的几率更大.呵呵,我就是i一枚.很出名的就是PuTTY(Windows,Linux都有的), ...

随机推荐

  1. 【剑指offer】数组中出现次数超过数组长度一半的数字,C++实现

    原创博文,转载请注明出处! # 题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...

  2. Mac安装最新tensorflow遇到的坑,记录下方便后人

    之前其他mac电脑安装tensorflow时候一切顺利,一行命令sudo pip install tensorflow就高搞定了,但是今天在新mac上安装tensorflow时候出现了一个bug,搞了 ...

  3. Java:浅克隆(shallow clone)与深克隆(deep clone)

    Summary 浅克隆与深克隆对于JavaSE来说,是个难度系数比较低的概念,但不应该轻视它. 假设一个场景:对于某个list,代码里并没有任何对其的直接操作,但里面的元素的属性却被改变了,这可能就涉 ...

  4. BZOJ1857 Scoi2010 传送带 【三分】

    BZOJ1857 Scoi2010 传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P ...

  5. eclipse添加propedit插件

    1.propedit插件 这个插件基本上可以支持各种语言的转换. 2.方法如下: “help”--“Install new software”--“add” name:propedit Locatio ...

  6. 开启opcache提高性能

    在开启opcache之前,我们先介绍一下编译与解释: 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快:而解释器则是只在执行程 ...

  7. Centos6.5 恢复误删的系统面板

    在CentOS6.5下往面板上拖应用程序时,手贱了,点了"Delete This Panel".结果就悲剧了~面板不见了! 从网上搜了一下解决方法,列举一下. 1.新建面板 如果下 ...

  8. JavaSE 手写 Web 服务器(二)

    原文地址:JavaSE 手写 Web 服务器(二) 博客地址:http://www.extlight.com 一.背景 在上一篇文章 <JavaSE 手写 Web 服务器(一)> 中介绍了 ...

  9. Centos下 yum方式安装LAMP

    首先安装apache    centos可以直接yum安装apache . 配置网易163 yum源  http://www.cnblogs.com/carbon3/p/5635403.html 一. ...

  10. WebApi和Andriod对接访问模式问题

    最近在做WebApi和Andriod接口的对接,中途出现一个问题就是返回格式的问题.由于之前使用WebService的时候使用的一直都是json的序列化和反序列话格式,所以一开始在webapi中通样使 ...