Linux中expect工具完成远程交互通信(2)
上一篇文章讲诉了怎么利用expect工具完成远程交互通信,通过打包后的脚本zlssh可以实现远程执行指令。那么这一讲更进一步,利用FOR循环完成局域网中linux主机集群操作。
先来看看读取linuxhosts文件然后打印出来的脚本,linuxhosts文件里面可以放置局域网集群的主机IP地址,也可以放置主机名,这需要在/etc/hosts( hosts文件是Linux系统中一个负责IP地址与域名快速解析的文件)里面进行配置。详情请参考笔者以前的文章-linux中/etc/hosts文件配置。
#!/bin/bash
for myhostname in `cat linuxhosts`
do
echo $myhostname
done
说明的脚本循环完成文件中定义的主机,那么再加上zlssh脚本就可以循环完成局域网集群的远程控制功能。
auto_cmd.sh:
#!/bin/bash
hostname = `hostname`
for myhostname in `cat /home/pi/linuxhosts`
do
if [ $myhostname = $hostname ]
then
echo " This local machine !!!"
continue;
fi
net=`ping $myhostname -c 1 -w 1 |grep received | awk '{print $4}'`
if [ "$net" = "0" ]
then
echo " ==============host $myhostname is down ??? "
else
./zlssh $myhostname password "$1"
echo "---------$myhostname"
fi
done
远程关机集群运行:./auto_cmd.sh shutdown.
脚本就是循环读取linuxhosts文件,看是否能ping通,然后执行通过zlssh远程执行shutdown指令。但是判断为本机则跳过不执行,毕竟本机被关了怎么执行后续的命令呢。
在集群的管理主机上,把主机写入linuxhosts文件,通过auto_cmd.sh可以统一对集群内的主机做一系列的操作,完成自动化运维工作。
或者格式化读取写好的/etc/hosts文件,比如读取第一行的ip数据:cat /etc/hosts | awk '{print $1}',awk 可以实现按行读取/etc/hosts文件来查找ip地址。
SSH更换为SCP
上面打包功能化ssh,远程到局域网集群执行命令,如果将ssh更换为scp,那么一个远程分发脚本就出来了。 即将上一篇文章中zlssh的spawn ssh $remote_host $command更换为spawn scp $local_file $remote_path。
./zlscp 192.168.31.103 password get.py 192.168.31.103:/home/pi
这一条命令就是将文件 get.py分发到局域网集群中的/home/pi目录下。