shell写一个自动遍历服务器的脚本
根据需求实现相应功能,比如:自动ssh登陆若干服务器 并且在若干服务器中执行固定命令。
学过开发的应该知道“包”的概念,就是一个包仅实现一个功能,后面需要的时候调用即可,这种在一定程度上解决了大量代码的可观性和可易改性, shell 也一样,也可以有包的概念,就是 一个vim文件实现一个功能,后面直接调用即可;
这里我实现的功能是 每天跑一遍脚本,查看筛选后每台服务器的 / 目录使用情况 并且把/ 目录情况自动保存到当天日期里面,自动删除创建7天以上的文本(保存的信息)。
思路:单独用一个文件 用交互式脚本遍历若干服务器, 再创建另一个普通shell脚本 调用交互式脚本后 并筛选自己想查看的信息打印到屏幕。
第一文件(交互式脚本):
#!/bin/bash/expect
#脚本解释:spawn 新建一个进程,这个进程的交互由expect控制
#expect 等待接受进程返回的字符串,直到超时时间,根据规则决定下一步
#send 发送字符串给expect控制的进程
#interact 将脚本的控制权交给用户,用户可继续输入命令
#当输出中包含(yes/no)?时,输出yes和回车,同时重新执行此多分支语句。
#当输出中匹配*assword:时,输出password变量的数值和回车。
#脚本说明:用最简单的方式实现想要的功能。
#免key登陆 并不需要密码 所以没有interact
#其他需要密码登陆的 有interact 所以如果期间有某台服务器无法登陆了 到问题ip处就会
#停止,这时需要在脚本中找到该问题ip 吧 interact 注释掉 重新跑脚本,同
#理,如果已经注释掉interact的ip恢复正常了 脚本跑到该ip也会停止,这时
#需要找到对应ip 吧interact取消注释;
#定义时间格式
set date [ clock format [ clock seconds ] -format “%Y%m%d” ]
#查看定义时间
puts “\n date = $date”
#免密登陆的服务器
spawn ssh 1.1.1.1 df -h
expect {
“*assword” { send “\r”;}
“yes/no” {send "yes\r"exp_continue}
}
spawn ssh 1.1.1.1 df -h
expect {
“*assword” { send “\r”;}
“yes/no” {send "yes\r"exp_continue}
}
…
#需要密码登陆的服务器
spawn ssh 1.1.1.1 df -h
expect {
“*assword” { send “password\r”;}
“yes/no” {send "yes\r"exp_continue}
}
interact
spawn ssh 1.1.1.1 df -h
expect {
“*assword” { send “password\r”;}
“yes/no” {send "yes\r"exp_continue}
}
interact
…
第二文件(普通shell脚本):
#!/bin/bash
#调用交互式脚本
expect ip1.sh
#只保留7天的信息,超过7天的 自动删除。
find /teamsun/ -mtime +7 -name “*” -exec rm -rf {} ;
echo -e “\n”
echo -e “\033[31m 正在写入df -h信息到 /teamsun/date +%Y%m%d
(date +%Y%m%d 两边有 `` 这个符号,下面同理),请稍等 \033[0m”
echo -e “\n”
#跑一次脚本则自动吧当天df -h全部情况写入到该日期文件中
expect ip1.sh > /teamsun/date +%Y%m%d
#查看所有/目录使用情况
#grep命令解释:E:支持正则表达式,B显示前2行内核,‘条件1|条件2|条件3|…’ 其中条件是 / 目录的 Filesystem 全称,df -h 可查看。
grep -En ‘/dev/mapper/ibmpkvm_vg_root-ibmpkvm_lv_system|/dev/mapper/os-root|/dev/mapper/rh
el_ceph-root|/dev/mapper/rhel_stor.*root’ /teamsun/date +%Y%m%d
echo -e “\n”
echo -e “\033[31m 如果/目录使用率有超过60的 可 cat -n /teamsun/date +%Y%m%d
查看对应ip \033[0m”
echo -e “\n”
#增加一个空格 以便于区分
echo -e “\n” >> /teamsun/date +%Y%m%d
#简便化 只保留 /目录和ip写入到文件中;
cat /teamsun/date +%Y%m%d
|grep -EB 2 ‘/dev/mapper/ibmpkvm_vg_root-ibmpkvm_lv_system|/dev/mapper/os-root|/dev/mapper/rh
el_ceph-root|/dev/mapper/rhel_stor.*root’ >> /teamsun/date +%Y%m%d
因为普通shell 脚本里调用了 交互式脚本,所以 这里只需要执行普通shell脚本即可: