1. 程式人生 > >Linux系統shell指令碼程式設計——生產實戰案例(批量檢查線上IP與開放埠)

Linux系統shell指令碼程式設計——生產實戰案例(批量檢查線上IP與開放埠)

Linux系統shell指令碼程式設計——生產實戰案例

在日常的生產環境中,可能會遇到需要批量檢查內網目前線上的主機IP地址有哪些,還可能需要檢查這些線上的主機哪些埠是開放狀態,因此依靠手工來檢查是可以實現,但比較費時費力,所以需要結合shell指令碼來實現批量檢查的功能,那麼今天就來做個小小的實驗。

1、開發指令碼前準備

一般大家都知道,測試主機是否線上,常用的命令無非就是ping、nmap,因此,首先找一個地址來測試下ping命令的效果

[[email protected] 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下去


[[email protected] 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個數據包,然後加上超時時間,自動停止,可以達到效果

[[email protected] scripts]#echo $?

0

[[email protected] 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

[[email protected] scripts]#echo $?

1

因此,我們可以通過返回值來判斷是否線上

2、開發簡單指令碼

既然有實現的方法了,那麼接下來就開始開發指令碼了

[[email protected] 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$n >/dev/null 2>&1

       #將命令結果不輸出

if [ $? -eq 0 ];then  

       #如果返回值為0就表明線上

 action  "$IP$n is online" /bin/true  

       #線上就列印此資訊

else                                              

         #否則就表示不線上

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

         #不線上就列印此資訊

fi

done

執行下指令碼看看結果如何

[[email protected] 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地址資訊,具體其中的引數這裡就不做詳細介紹了,後續有時間會分享它的相關引數用法

[[email protected] 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

[[email protected] 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返回的資訊中都會有這一行資訊,所以取相同的資訊。

[[email protected] scripts]#nmap -sS 172.16.1.1|grep "Nmap scan report for"

Nmap scan report for 172.16.1.1

[[email protected] scripts]#

nmap -sS 172.16.1.1|grep "Nmap scan report for"|awk '{print $5}'

172.16.1.1    

#取出IP資訊

[[email protected] 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 來實現,通過上面的資訊很容易觀察出來

[[email protected] 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

[[email protected] scripts]# nmap -sS 172.16.1.1|grep "open"|awk '{print $1}'

21/tcp

23/tcp

80/tcp

443/tcp

4、編寫指令碼並測試效果

[[email protected] 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地址,否則會有問題

執行指令碼,測試效果如何?

[[email protected] 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沒有出現的原因是它不線上

接下來測試下指令碼檢查的埠是否正確

[[email protected] 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.

[[email protected] 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.

[[email protected] 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.

從上面的結果來看,指令碼檢查的結果是正確,如果需要檢查整個網段只需要將定義IP變數時定義成“IP="172.16.1.0/24"”即可

指令碼寫的可能也不太完美,需要進行改進,歡迎各位大牛多指導,感謝!!!

更多內容請關注民工哥個人微信公眾號:友侃有笑(youkanyouxiao)


相關推薦

Linux系統shell指令碼程式設計——生產實戰案例(批量檢查線上IP開放)

Linux系統shell指令碼程式設計——生產實戰案例 在日常的生產環境中,可能會遇到需要批量檢查內網目前線上的主機IP地址有哪些,還可能需要檢查這些線上的主機哪些埠是開放狀態,因此依靠手工來

Linux系統——shell指令碼

      shell指令碼程式設計 作用:通過命令列解析的方式,自動執行設定好的程式或命令程式碼。(若將指令碼掛到定時任務中,就會自動在非工作時間裡自動觸發執行程式)   Shell指令碼檔案以“.sh”結尾 規範的Shell指令碼第一行會指出由哪個程式

Linux系統——shell指令碼應用示例

傳入一個網段地址,自動找出本網段記憶體活的IP地址。2,將存活的IP地址當作密碼來建立Linux使用者,使用者名稱格式為:你的名字_數字 3,有幾個存活IP地址,就自動建立幾個使用者   4,最後將建立的使用者名稱和密碼寫入到/tmp目錄下的某檔案裡 (1)找存活的ip (2)將ip去

LinuxShell指令碼程式設計

Shell概念  一、概念 Shell 是一個用 C 語言編寫的程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心 的服務。Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一

linuxShell指令碼程式設計

Shell指令碼的建立與執行 在子Shell中執行 當執行一個指令碼檔案時,Shell就會產生一個子Shell(即一個子程序)去執行命令檔案中的命令。 1.將檔名作為Shell命令的引數:$bash script-file 2.現將指令碼檔案的許可權改為可執行,然後執行指令碼:$scri

Linuxshell指令碼程式設計例項--遍歷所有檔案,並按月份打成zip包

原始檔案形式如下圖: 經過shell指令碼處理之後,按月生成的zip包如下圖: 完成上述工作的shell指令碼如下: #下面這行程式碼並不是註釋,它的作用是表名該指令碼使用哪個shell直譯器 #! /bin/sh #變數賦值,等號=兩邊不能有空格 #需要處理的檔案目錄

從新手到系統管理員(四):Linux Shell指令碼程式設計之數學(Part I)

本文由 [茶話匯] – [Qing] 編譯自 [Avishek Kumar] 轉載請註明出處 這部分主要討論數學相關的shell指令碼程式設計。 加法運算 新建一個檔案“Addition.sh”,輸入下面的內容並賦予其可執行的許可權。 [code language=”bash”] #!/bin/b

從新手到系統管理員(二):Linux新手學習Shell指令碼程式設計的五個例子

本文由 [茶話匯] – [Qing] 編譯自 [Avishek Kumar] 轉載請註明出處 例子一:繪製特殊圖形 [code language=”bash”] #!/bin/bash MAX_NO=0 echo -n "Enter Number between (5 to 9) : " re

Shell指令碼程式設計——瞭解你的Linux系統必須掌握的20個命令

    要想詳細瞭解你的Linux系統,為系統評估和效能調化提供準確的資訊,那麼,你會經常用到這幾組命令。一. 系統資訊    1. 檢視核心版本、編譯主機、編譯器版本和編譯時間的資訊   cat /proc/version                         

Linux-Shell指令碼程式設計基礎(1)

1. 我們一般在使用Linux系統的時候,都活接觸到shell指令碼的使用,例如我們經常在linux系統中使用的ls命令、cd命令等,都是衣蛾簡單而又基本的shell命令,在 linux系統中我們一般的使用如下的格式來進行shell指令碼的編寫: (1)格式 #!bin/bash e

Linux Shell指令碼程式設計 --awk命令詳解

簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。    

Linux命令列shell指令碼程式設計大全(二)

十一、處理使用者輸入 命令列引數 讀取引數: $0是程式名,$1是第一個引數,$2是第二個引數,以此類推,直到第9個引數$9。當引數個數超過10以後,需要在變數數字周圍加上花括號,如${10},如果輸入到命令列的引數是字串且含有空格,需要使用引號。 #! /bin/bash echo

Linux命令列shell指令碼程式設計大全(一)

一、基本 bash shell命令 建立檔案 : touch 連結檔案:符號連結:是一個實實在在的檔案,兩個通過符號連結在一起的檔案,彼此的內容並不相同。使用ln -s命令。 硬連結:會建立獨立的虛擬檔案,其中包含了原始檔案的資訊及位置。但他們從根本上而言是同一個檔案。原始檔案必須事

Linux命令列shell指令碼程式設計大全(三)

十二、呈現資料 輸入和輸出     標準檔案描述符                  0 STDIN 標準輸入   &n

Linux命令列shell指令碼程式設計大全》讀書筆記————第三章 基本的bash shell命令

本章內容 1、使用shell 2、bash手冊 3、瀏覽檔案系統 4、檔案和目錄列表 5、管理檔案和目錄 6、檢視檔案內容   3.3 bash手冊 命令: man  xterm  作用:檢視檢視xterm使用者手冊 man命

Linux命令列shell指令碼程式設計大全》讀書筆記————第一章 初識Linux shell

本章內容 1、什麼是Linux 2、Linux核心的組成   1、1 什麼是Linux Linux課劃分為以下四部分 a)Linux核心 b)GNU工具 c)圖形化桌面環境 d)應用軟體   1.1.1 深入探究Linux核心

Linux命令列Shell指令碼程式設計大全(四)

一、建立函式 1.基本的指令碼函式 1.1 建立函式 function name { commands} 1.2 使用函式 在行中指定函式名就行了 ## 建立函式,注意函式名和大括號中間有空格,不然會報錯 function func1 { echo "

linux命令列shell指令碼程式設計大全》第三版

《linux命令列與shell指令碼程式設計大全》 全書4部分:☆ 【1】linux命令列(1-10章)☆ 【2】shell指令碼程式設計基礎(11-16章)☆ 【3】高階shell指令碼程式設計(17-23章):正則表示式☆ 【4】建立實用的指令碼(24-26章)>

Linux Shell指令碼程式設計提高(12)

實際上Shell是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心,不僅如此,Shell有自己的程式語言用於對命令的編輯,它允許使用者編寫由shell命令組成的程式.Shel程式語言具有普通程式語言的很多特點,比如它也有迴圈結構和分支控制結構等,用這種程式語言編寫的Shell程式與其他應用程式具有同

Linux軟體包安裝Shell指令碼程式設計

Linux軟體包安裝二進位制軟體包管理:RPM與YUMRPM軟體包例子:jdk-7u80-linux-x64.rpm其中包括軟體名(jdk),版本號(7u80),適用平臺(linux-x64)RPM管理1、解除安裝# rpm    -e    jdk注:如果其他軟體包有依賴關