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

我们将使用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-16】数值的整数次方,C++实现(递归)

    原创博文,转载请注明出处! 1.题目       给定一个double类型的浮点数base和int类型的整数exponent,求base的exponent次方.注意:不得使用库函数,同时不需要考虑大数 ...

  2. LeetCode - Course Schedule 解题报告

    以前从来没有写过解题报告,只是看到大肥羊河delta写过不少.最近想把写博客的节奏给带起来,所以就挑一个比较容易的题目练练手. 原题链接 https://leetcode.com/problems/c ...

  3. table中文字过长使用省略号

    1.设置table固定布局,否则自适应布局会不受控制 table{ table-layout: fixed; } 2.设定td宽度占比 <table> <col width=&quo ...

  4. 每天一个linux命令:【转载】nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  5. 使用python处理selenium中的css_selector定位元素的模糊匹配问题

    # 匹配id,先指定一个html标签,然后加上“#”符号,再加上id的属性值 self.driver.find_element_by_css_selector('div#ID').click() # ...

  6. ruby 的数组操作

    转自:http://fujinbing.iteye.com/blog/1126232 1. & [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] # => [1, 3] ...

  7. JSONModel源码阅读笔记

    JSONModel是一个解析服务器返回的Json数据的库. http://blog.csdn.net/dyllove98/article/details/9050905 通常服务器传回的json数据要 ...

  8. Windows10安装MySQL8.0

    1.到MySQL官网下载安装包:https://dev.mysql.com/downloads/mysql/:选择8.0版本: 2.将下载好的安装包(mysql-8.0.12-winx64 .zip) ...

  9. Portainer docker 可视化管理工具

    1. 快速使用 docker run -d -p 9000:9000 portainer/portainer 2. docker  swarm  模式 docker service create \ ...

  10. mui 拨打电话

    function callPhone() { let btnArray = ['拨打', '取消']; let Phone = "10086"; mui.confirm('是否拨打 ...