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

我们将使用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. object references an unsaved transient instance - save the transient instance before flushing: com.jspxcms.core.domain.ScTeam

    object references an unsaved transient instance - save the transient instance before flushing: com.j ...

  2. Session学习

    Session学习 Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通 ...

  3. BZOJ3932 CQOI2015 任务查询系统 【主席树】

    BZOJ3932 CQOI2015 任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei, ...

  4. tableau-基本函数

    一.数据术语 维度——包含诸如文本和日期等类别数据的字段. 度量——包含可以聚合的数字的字段. 二.字段图标 Abc  蓝色图标->离散字段 #     绿色图标->连续字段 =Abc = ...

  5. WinForm 窗体初始位置篇

    1.在C#中,From本身有个StartPosition属性可以控制居中显示. StartPosition 默认值是WindowsDefaultLocation ,我们只需要改成CenterScree ...

  6. 【转】我的第一个Python小程序

    原文网址:http://blog.csdn.net/randyqiu/article/details/4484089 人的每个第一次都有点特别的意义,所以下面这个小程序我把他记录下来做个纪念. 因为要 ...

  7. git clone遇到的[ssh: connect to host github.com port 22]

    起因 在学习递归的时候,对汉诺塔小研究了一番,参考网上写了个demo,后面就想同步到github. 过程 这台电脑是新电脑,所以需要先本地生成ssh key:ssh-keygen -t rsa -C ...

  8. mysql+matlab配置

    mysql 中一直出现'> 单双引号没有配对 mysql 连接matlab 1, 到mysql官网下载 http://dev.mysql.com/downloads/connector/j/(m ...

  9. (转)Android短信的发送和接收监听

    /**发送与接收的广播**/     String SENT_SMS_ACTION = "SENT_SMS_ACTION";     String DELIVERED_SMS_AC ...

  10. MEF学习总结(4)---Container层

    通过AttributeedModelPrograming,我们可以声明暴露组件,依赖组件,发现组件,但是所有这些需要有一个触发点.即需要把所有这些组合在一起来协同工作,最终实现依赖注入.这就是Cont ...