Linux系统shell脚本编程——生产实战案例
Linux系统shell脚本编程——生产实战案例
在日常的生产环境中,可能会遇到需要批量检查内网目前在线的主机IP地址有哪些,还可能需要检查这些在线的主机哪些端口是开放状态,因此依靠手工来检查是可以实现,但比较费时费力,所以需要结合shell脚本来实现批量检查的功能,那么今天就来做个小小的实验。
一般大家都知道,测试主机是否在线,常用的命令无非就是ping、nmap,因此,首先找一个地址来测试下ping命令的效果
[root@centos6 scripts]# ping 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
64 bytes from 172.16.1.1: icmp_seq=1 ttl=255 time=3.43 ms
64 bytes from 172.16.1.1: icmp_seq=2 ttl=255 time=0.699 ms
^C
--- 172.16.1.1 ping statistics ---
9 packets transmitted, 9 received, 0% packet loss, time 8448ms
rtt min/avg/max/mdev = 0.525/1.053/3.436/0.884 ms
好像单纯的这种命令是无法来做批量检查的,必须要带一些参数,否则它们一直ping下去
[root@centos6 scripts]# ping -W 2 -c 2 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
64 bytes from 172.16.1.1: icmp_seq=1 ttl=255 time=0.704 ms
64 bytes from 172.16.1.1: icmp_seq=2 ttl=255 time=0.481 ms
--- 172.16.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.481/0.592/0.704/0.114 ms
----
这种方法可以实现,测试发送2个数据包,然后加上超时时间,自动停止,可以达到效果
[root@centos6 scripts]# echo $?
0
[root@centos6 scripts]# ping -W 2 -c 2 172.16.1.100
PING 172.16.1.100 (172.16.1.100) 56(84) bytes of data.
^C
--- 172.16.1.100 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 2836ms
[root@centos6 scripts]# echo $?
1
因此,我们可以通过返回值来判断是否在线
2、开发简单脚本
既然有实现的方法了,那么接下来就开始开发脚本了
[root@centos6 scripts]# vi checkip.sh
#!/bin/sh
. /etc/init.d/functions
#加载系统函数库
CMD="ping -W 2 -c 2"
#定义命令变量
IP="172.16.1.2 172.16.1.3 172.16.1.100"
#定义IP变量
for n in $IP
#for循环语句
do
CMD IP
#将命令结果不输出
if [ $? -eq 0 ];then
#如果返回值为0就表明在线
action "
#在线就打印此信息
else
#否则就表示不在线
action "
#不在线就打印此信息
fi
done
执行下脚本看看结果如何
[root@centos6 scripts]# sh checkip.sh
172.16.1.2 is online [ OK ]
172.16.1.3 is online [ OK ]
172.16.1.100 is not online [FAILED]
此时肯定有小伙伴问了,你这个脚本测试的只有三个IP,如果内网整个网段IP都手工写上去,岂不是更费时费力,因此,如果是整个网段,那么定义IP变量时可以定义成这样IP="172.16.1." ,因为前三位是相同的,写for 循环时可以修改成如下
for n in `seq 254`
do
CMD IP
done
具体这里就不再测试了,有兴趣的可以自行测试下
3、开发nmap脚本检查在线IP与在线IP的开放端口情况
首先得了解下nmap的一些参数,它也是非常实用的命令之一,在日常实际生产环境中,经常用来检查IP、端口、URL地址信息,具体其中的参数这里就不做详细介绍了,后续有时间会分享它的相关参数用法
[root@centos6 scripts]# nmap -sP 172.16.1.1
Starting Nmap 5.51 ( http://nmap.org ) at 2016-12-03 21:09 CST
Nmap scan report for 172.16.1.1
Host is up (0.0091s latency).
MAC Address: 04:BD:70:FB:A9:B7 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
[root@centos6 scripts]# nmap -sP 172.16.1.100
Starting Nmap 5.51 ( http://nmap.org ) at 2016-12-03 21:09 CST
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 0.41 seconds
从上面的结果来看,很容易发现在线与不在线返回的信息不同,但是我们需要取得在线的IP地址信息,那到就只能取 Nmap scan report for 172.16.1.1 ,因为所有在线的IP返回的信息中都会有这一行信息,所以取相同的信息。
[root@centos6 scripts]# nmap -sS 172.16.1.1|grep "Nmap scan report for"
Nmap scan report for 172.16.1.1
[root@centos6 scripts]#
nmap -sS 172.16.1.1|grep "Nmap scan report for"|awk '{print $5}'
172.16.1.1
#取出IP信息
[root@centos6 scripts]# nmap -sS 172.16.1.1
Starting Nmap 5.51 ( http://nmap.org ) at 2016-12-03 20:56 CST
Nmap scan report for 172.16.1.1
Host is up (0.041s latency).
Not shown: 994 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp filtered ssh
23/tcp open telnet
80/tcp open http
179/tcp filtered bgp
443/tcp open https
MAC Address: 04:BD:70:FB:A9:B7 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 8.74 seconds
检查开启端口,我们可以通过过滤关键字 open 来实现,通过上面的信息很容易观察出来
[root@centos6 scripts]# nmap -sS 172.16.1.1|grep "open"
21/tcp open ftp
23/tcp open telnet
80/tcp open http
443/tcp open https
[root@centos6 scripts]# nmap -sS 172.16.1.1|grep "open"|awk '{print $1}'
21/tcp
23/tcp
80/tcp
443/tcp
[root@centos6 scripts]# vi checkip_namp01.sh
#!/bin/sh
. /etc/init.d/functions
#加载系统函数库
FCMD="nmap -sP "
#定义第一个命令变量
IP="172.16.1.1 172.16.1.2 172.16.1.100"
#定义IP变量
TCMD="nmap -sS"
#定义第一个命令变量
UPIP=`FCMD IP|grep "Nmap scan report for"|awk '{print
#定义获取在线IP的变量
for ip in ${UPIP}
#for手环语句
do
action "$ip is on line" /bin/true
#打印信息
UPPORT=`TCMD ip|grep "open"|awk '{print
#定义获取在线IP的开放端口变量
for port in ${UPPORT}
#二层循环检查端口
do
action "
#将上面在线IP开放的端口信息打印输出
done
done
注:UPPORT=`TCMD ip|grep "open"|awk '{print
执行脚本,测试效果如何?
[root@centos6 scripts]# sh checkip_namp01.sh
172.16.1.1 is on line [ OK ]
172.16.1.1 21/tcp is open [ OK ]
172.16.1.1 23/tcp is open [ OK ]
172.16.1.1 80/tcp is open [ OK ]
172.16.1.1 443/tcp is open [ OK ]
172.16.1.2 is on line [ OK ]
172.16.1.2 23/tcp is open [ OK ]
172.16.1.100没有出现的原因是它不在线
接下来测试下脚本检查的端口是否正确
从上面的结果来看,脚本检查的结果是正确,如果需要检查整个网段只需要将定义IP变量时定义成“IP="172.16.1.0/24"”即可
脚本写的可能也不太完美,需要进行改进,欢迎各位大牛多指导,感谢!!!
- Linux性能监控 - CPU、Memory、IO、Network
- 浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)
- WCF版的PetShop之三:实现分布式的Membership和上下文传递
- “高并发”问题如何解决?腾讯云一分钟配置的“黑科技”帮您
- 初探JavaScript(三)——JS带我"碰壁"带我飞
- 初探JavaScript(四)——作用域链和声明提前
- 开发人员看测试之运行Github中的JBehave项目
- 如何高效地合并Spark社区PR到自己维护的分支
- 开发人员看测试之TDD和BDD
- AngularJS入门心得1——directive和controller如何通信
- AngularJS入门心得2——何为双向数据绑定
- AngularJS入门心得3——HTML的左右手指令
- AngularJS入门心得4——漫谈指令scope
- Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[上]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Saltstack_使用指南11_配置管理-状态之间依赖关系 4.1. 部署架构4.2. Apache和PHP的SLS【正向依赖】4.3. mariadb 的 SLS
- 前端工程化之CICD那点破事
- Saltstack_使用指南12_配置管理-jinja模板 4.1. 部署架构4.2. 本章涉及的 pillar 的信息4.3. 配置文件 httpd.conf 修改
- Saltstack_使用指南13_runner的job和manage与execution的saltutil 5.1. master执行5.2. 查看当前活动的jobs
- Saltstack_使用指南14_无master 3.1. 常规信息3.2. grains设置3.3. pillar设置
- 在CDH7.1.1中安装NiFi
- 重学前端(三)-聊聊我们的浏览器的那些事
- Saltstack_使用指南15_多master 3.1. 创建冗余的master3.2. 拷贝主master的key和配置到冗余的master3.3. 启动冗余ma
- Saltstack_使用指南16_syndic 3.1. 部署salt-master3.2. 其他配置与部署4.1. 部署salt-syndic4.2. syndic
- Centos7安装单机版MongoDB
- Saltstack_使用指南17_salt-ssh
- Saltstack_使用指南18_API
- Centos7安装单机版Redis
- Vue3 Composition-Api + TypeScript + 新型状态管理模式探索。
- Saltstack_实战指南01_系统规划