Linux系统shell脚本编程――生产实战案例

简介:

Linux系统shell脚本编程――生产实战案例

 在日常的生产环境中,可能会遇到需要批量检查内网目前在线的主机IP地址有哪些,还可能需要检查这些在线的主机哪些端口是开放状态,因此依靠手工来检查是可以实现,但比较费时费力,所以需要结合shell脚本来实现批量检查的功能,那么今天就来做个小小的实验。

1、开发脚本前准备
一般大家都知道,测试主机是否在线,常用的命令无非就是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 $n >/dev/null 2>&1

     #将命令结果不输出

if [ $? -eq 0 ];then

     #如果返回值为0就表明在线

action "$n is online" /bin/true

      #在线就打印此信息

else

      #否则就表示不在线

action "$IP$n is not online" /bin/false

      #不在线就打印此信息

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$n(将两段数字拼接成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


4、编写脚本并测试效果

[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 $5}'

#定义获取在线IP的变量

for ip in ${UPIP}

#for手环语句

do
action "$ip is on line" /bin/true
#打印信息

  UPPORT=`$TCMD $ip|grep "open"|awk '{print $1}'`
    #定义获取在线IP的开放端口变量

for port in ${UPPORT}

    #二层循环检查端口

do

   action "$ip $port is open"  /bin/true
   #将上面在线IP开放的端口信息打印输出

done
done`
注:UPPORT=$TCMD $ip|grep "open"|awk '{print $1}' 定义这个变量时,取的IP地址一定要是上一个循环取出的IP地址,否则会有问题
执行脚本,测试效果如何?

[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没有出现的原因是它不在线```
接下来测试下脚本检查的端口是否正确

[root@centos6 scripts]# telnet 172.16.1.1 443
Trying 172.16.1.1...
Connected to 172.16.1.1.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
[root@centos6 scripts]# telnet 172.16.1.1 21
Trying 172.16.1.1...
Connected to 172.16.1.1.
Escape character is '^]'.
220 FTP service ready.
^]
telnet> quit
Connection closed.
[root@centos6 scripts]# telnet 172.16.1.2 23
Trying 172.16.1.2...
Connected to 172.16.1.2.
Escape character is '^]'.
TL-AP301C login:
telnet> quit
Connection closed.`

文章转载自 开源中国社区[http://www.oschina.net]

目录
相关文章
|
21天前
|
人工智能 安全 Linux
|
1月前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
33 0
Linux 如何更改默认 Shell
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
80 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
37 0
|
监控 Linux
linux服务器显卡监控脚本
linux服务器显卡监控脚本
139 0
|
监控 Shell Linux
Linux 性能监控之CPU&内存&I/O监控Shell脚本1
Linux 性能监控之CPU&内存&I/O监控Shell脚本1
192 0