目录
背景
公司临时有一套系统,大约有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
源代码下载
所有的脚本在上面都有,你要是觉得懒得复制,这里打包好了