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去
Linux之Shell指令碼程式設計
Shell概念 一、概念 Shell 是一個用 C 語言編寫的程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心 的服務。Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一
linux的Shell指令碼程式設計
Shell指令碼的建立與執行 在子Shell中執行 當執行一個指令碼檔案時,Shell就會產生一個子Shell(即一個子程序)去執行命令檔案中的命令。 1.將檔名作為Shell命令的引數:$bash script-file 2.現將指令碼檔案的許可權改為可執行,然後執行指令碼:$scri
Linux之shell指令碼程式設計例項--遍歷所有檔案,並按月份打成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注:如果其他軟體包有依賴關