使用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都有的), ...
随机推荐
- 【剑指offer】数组中出现次数超过数组长度一半的数字,C++实现
原创博文,转载请注明出处! # 题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...
- Mac安装最新tensorflow遇到的坑,记录下方便后人
之前其他mac电脑安装tensorflow时候一切顺利,一行命令sudo pip install tensorflow就高搞定了,但是今天在新mac上安装tensorflow时候出现了一个bug,搞了 ...
- Java:浅克隆(shallow clone)与深克隆(deep clone)
Summary 浅克隆与深克隆对于JavaSE来说,是个难度系数比较低的概念,但不应该轻视它. 假设一个场景:对于某个list,代码里并没有任何对其的直接操作,但里面的元素的属性却被改变了,这可能就涉 ...
- BZOJ1857 Scoi2010 传送带 【三分】
BZOJ1857 Scoi2010 传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P ...
- eclipse添加propedit插件
1.propedit插件 这个插件基本上可以支持各种语言的转换. 2.方法如下: “help”--“Install new software”--“add” name:propedit Locatio ...
- 开启opcache提高性能
在开启opcache之前,我们先介绍一下编译与解释: 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快:而解释器则是只在执行程 ...
- Centos6.5 恢复误删的系统面板
在CentOS6.5下往面板上拖应用程序时,手贱了,点了"Delete This Panel".结果就悲剧了~面板不见了! 从网上搜了一下解决方法,列举一下. 1.新建面板 如果下 ...
- JavaSE 手写 Web 服务器(二)
原文地址:JavaSE 手写 Web 服务器(二) 博客地址:http://www.extlight.com 一.背景 在上一篇文章 <JavaSE 手写 Web 服务器(一)> 中介绍了 ...
- Centos下 yum方式安装LAMP
首先安装apache centos可以直接yum安装apache . 配置网易163 yum源 http://www.cnblogs.com/carbon3/p/5635403.html 一. ...
- WebApi和Andriod对接访问模式问题
最近在做WebApi和Andriod接口的对接,中途出现一个问题就是返回格式的问题.由于之前使用WebService的时候使用的一直都是json的序列化和反序列话格式,所以一开始在webapi中通样使 ...