linux下利用expect批量查询所有服务器的磁盘空间占用情况【超详细-附带注释】

14 篇文章 0 订阅

目录

背景

思路

expect环境搭建

rpm安装

yum源安装

脚本编写

1、ipList文件

2、shell主脚本disk.sh

3、expect脚本disk.exp

赋权并执行

源代码下载


背景

公司临时有一套系统,大约有40台linux服务器,由于是创建初期,还在调试软件,日志之类的增长比较快,需要经常查看磁盘空间占用量,但又还没搭建监控系统,所以想了一个比较简单直接的方法,写一个脚本统计所有服务器的磁盘空间是使用情况

思路

1、借助 expect 处理交互的命令,可以将交互过程如 ssh 登录, ftp 登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理员的工作效率。

2、借助循环,自动遍历执行ip列表内的所有服务器

expect环境搭建

expect安装有两种方式,根据自身条件选择其中一种即可

rpm安装

适用于服务器不能联网或没有系统镜像的情况,自行下载系统对应版本的包进行安装

下载地址一:网易开源镜像网站

下载地址二:csdn积分资源(centos7.5已测试通过)

上传下载的rpm包到服务器,执行安装

rpm -ivh expect-5.45-14.el7_1.x86_64.rpm --nodeps --force

yum源安装

适用与服务器能连接互联网或配置有本地/局域网yum源且存在expect包的服务器。

yum源配置方法:linux配置本地YUM源及网络YUM源

yum源配置成功后执行yum install expect安装expect

[root@centos01 ~]# yum install expect
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
正在解决依赖关系
--> 正在检查事务
---> 软件包 expect.x86_64.0.5.45-14.el7_1 将被 安装
--> 解决依赖关系完成

依赖关系解决

===========================================================================================================================
 Package                    架构                       版本                                 源                        大小
===========================================================================================================================
正在安装:
 expect                     x86_64                     5.45-14.el7_1                        base                     262 k

事务概要
===========================================================================================================================
安装  1 软件包

总计:262 k
安装大小:566 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告:RPM 数据库已被非 yum 程序修改。
  正在安装    : expect-5.45-14.el7_1.x86_64                                                                            1/1 
  验证中      : expect-5.45-14.el7_1.x86_64                                                                            1/1 

已安装:
  expect.x86_64 0:5.45-14.el7_1                                                                                            

完毕!

脚本编写

创建三个脚本及文件,

1、ipList文件

ipList文件内容如下,每一行存储一台服务器的ip和密码(分隔符随意,只要后续的awk指定分隔符时记得一致就行,此案列分隔符用了‘@’)

[root@cen128 disk]# cat ipList 
192.168.130.129@111111
192.168.130.130@111111

2、shell主脚本disk.sh

shell主脚本disk.sh内容如下,主要负责循环读取ipList文件内的ip和密码并传递给后续调用的expect.exp脚本

[root@cen128 disk]# cat disk.sh 
#!/bin/bash
for line in $(cat ipList)
do
IP=$(echo  $line|awk -F '@' '{print $1}')
PWD=$(echo  $line|awk -F '@' '{print $2}')
echo "===================="${IP}"磁盘使用情况=================="
/usr/bin/expect  disk.exp ${IP} ${PWD}
done

第一行:声明脚本执行解释器

第二行:fo循环读取ipList文件内容并赋值给变量line,每次循环读取一行,即第一次循环读取到“192.168.130.129@111”

第三行:开始

第四行:利用echo输出line的值(此时得到了ipList的第一行192.168.130.129@111),通过管道后利用awk截取指定列的内容(-F参数指定‘@’为分隔符),然后通过‘{print $1}’指定第一列,即得到第一台服务器ip并赋值给变量IP

第五行:同上,通过‘{print $2}’得到第一台服务器的密码并赋值给变量PWD

第六行:辅助行,可忽略,仅为了后续输出内容便于查看

第七行:调用expect脚本disk.exp,后面的${IP}和${PWD}是前面获取到的ip和密码,这里需要传递给即将调用的disk.exp脚本作为输入参数的。

3、expect脚本disk.exp

disk.exp脚本如下,主要根据上一步fdisk.sh传递过来的ip和密码自动完成人机交互登陆远程服务器并执行磁盘查询工作。

[root@cen128 disk]# cat disk.exp 
#!/usr/bin/expect 
set IP [lindex $argv 0]
set PWD [lindex $argv 1]
set timeout 10
spawn ssh root@${IP}  df -h
expect {
    "yes" {
        send "yes\n"
        expect "*assword:" { send "${PWD}\n" } }
    "*assword:" { send "${PWD}\n" }
    timeout  {   send_error "User 'root' login timeout.\n";  exit 1;  }}
send "exit/r"
expect eof

第一行:申明脚本解释器

第二行:设置ip变量IP并获取值(上一个脚本中/usr/bin/expect  disk.exp ${IP} ${PWD}一行会把变量ip和密码顺序存入数组$argv中,获取数组中第一个值(下标从0开始)即得到第一台服务器ip)

第三行:同上,设置密码变量PWD并从数组中获取值

第四行:设置超时时间(秒),代表后续内容必须在该限定时间内完成,否则跳出或输出指定内容

第五行:spawn  启动一个新进程

                ssh  root@${IP} df -h   shell脚本固定用法,远程到指定服务器并执行df -h查询磁盘,但注意执行的机制,这里并不是把该语句当一句执行,实际上是先执行ssh root@192.168.130.129远程登陆到服务器(此时需要提示输入是否远程到服务器,然后提示输入密码,正确后才能登陆远程服务器),然后才执行df -h,并将结果打印到当前控制台。

 第六行:expect:从上一步创建的进程接受指定字符串,即接收ssh root@192.168.130.129 命令的输出结果如下,接受到到字符为“root@192.168.130.129's password:”,因为我不是第一次远程到129服务器,如果是第一次,会有一个确认的操作,关键字是yes/no

[root@cen128 shell]# ssh 192.168.130.129
root@192.168.130.129's password:

第七行:根据接收到的字符串进行判断并进行人机交付,判断接收到的字符是否包含yes关键字,如果不包含即执行第10行,包含即执行8-9行(一般只有第一次远程到某台服务器才会有确认操作),

 第八行:模拟输入yes,输入yes后继续下一步,此时第9行的expect接收到的控制台字符串如上图所示,关键词是password,则模拟输入密码完成登陆操作

第九行:expect接收到的控制台字符串如上图所示,关键词是password,则模拟输入密码完成登陆操作

第十行:响应第四行,若超过10秒未执行完成,即输出双引号内的内容,以防止不能远程时进程一直卡住

第十一行:退出远程

第十二行:结束expect

赋权并执行

赋权:执行赋权操作,给fdisk.sh和expect.exp赋予可执行权限

[root@cen128 disk]# chmod a+x disk*  && ll
总用量 12
-rwxr-xr-x 1 root root 413 8月  28 15:29 disk.exp
-rwxr-xr-x 1 root root 241 8月  28 15:25 disk.sh
-rw-r--r-- 1 root root  46 8月  28 14:50 ipList

执行:执行./disk.sh > log.log命令,执行所有指定服务器空间并将结果输出到log.log文件

[root@cen128 disk]# ./disk.sh > log.log
[root@cen128 disk]# cat log.log 
====================192.168.130.129磁盘使用情况==================
spawn ssh root@192.168.130.129 df -h
root@192.168.130.129's password: 
文件系统                          容量  已用  可用 已用% 挂载点
/dev/mapper/centos_centos01-root   46G  7.9G   39G   18% /
devtmpfs                          471M     0  471M    0% /dev
tmpfs                             488M     0  488M    0% /dev/shm
tmpfs                             488M   15M  473M    3% /run
tmpfs                             488M     0  488M    0% /sys/fs/cgroup
/dev/sda1                        1014M  170M  845M   17% /boot
tmpfs                              98M   12K   98M    1% /run/user/42
tmpfs                              98M     0   98M    0% /run/user/0
====================192.168.130.130磁盘使用情况==================
spawn ssh root@192.168.130.130 df -h
root@192.168.130.130's password: 
文件系统                          容量  已用  可用 已用% 挂载点
/dev/mapper/centos_centos01-root   46G  7.5G   39G   17% /
devtmpfs                          471M     0  471M    0% /dev
tmpfs                             488M     0  488M    0% /dev/shm
tmpfs                             488M   15M  473M    3% /run
tmpfs                             488M     0  488M    0% /sys/fs/cgroup
/dev/sda1                        1014M  170M  845M   17% /boot
tmpfs                              98M   12K   98M    1% /run/user/42
tmpfs                              98M     0   98M    0% /run/user/0

源代码下载

所有的脚本在上面都有,你要是觉得懒得复制,这里打包好了

csdn付费资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜灬狼丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值