1. 程式人生 > >Linux shell相關基礎,建立shell指令碼掃描判斷區域網主機作業系統型別

Linux shell相關基礎,建立shell指令碼掃描判斷區域網主機作業系統型別

nmap:linux使用nmap 對區域網掃描,檢視arp快取表就可以知道局域內主機ip和mac了,方法如下:

nmap引數-sP -PU -sS ,-sS半開放掃描,不用執行完TCP三次握手,執行得很快。nmap -A掃描詳細資訊,速度慢。

掃描之後檢視arp快取表獲取區域網主機IP地址 cat /proc/net/arp

一般作業系統ping返回預設TTL:windows 128 win7 64 linux64 unix255

linux shell 相關:

    大於號:將一條命令執行結果(標準輸出,或者錯誤輸出,本來都要列印到螢幕上面的)重定向其它輸出裝置(檔案,開啟檔案操作符,或印表機等等)

    >> 是追加內容( 加在原文字下一行,非原文字末尾)

    > 是覆蓋原有內容(清空並重寫)

    小於號:命令預設從鍵盤獲得的輸入,改成從檔案,或者其它開啟檔案以及裝置輸入

    $:$ip代表 ip字串 

    ping -c 2 傳送兩個包後停止

    反引號,單引號,雙引號:

       反引號位 (`) 位於鍵盤的Tab鍵的上方、1鍵的左方。注意與單引號(')位於Enter鍵的左方的區別。
  在Linux中起著命令替換的作用。命令替換是指shell能夠將一個命令的標準輸出插在一個命令列中任何位置。
  如下,shell會執行反引號中的date命令,把結果插入到echo命令顯示的內容中。
  [[email protected]

sh]# echo The date is `date`
  The date is 2011年 03月 14日 星期一 21:15:43 CST
  
  單引號、雙引號用於使用者把帶有空格的字串賦值給變數事的分界符。
  [[email protected] sh]# str="Today is Monday"
  [[email protected] sh]# echo $str
  Today is Monday
  如果沒有單引號或雙引號,shell會把空格後的字串解釋為命令。
  [[email protected] sh]# str=Today is Monday
  bash: is: command not found
  單引號和雙引號的區別。單引號告訴shell忽略所有特殊字元,而雙引號忽略大多數,但不包括$、\、`。
  [
[email protected]
sh]# testvalue=100
  [[email protected] sh]# echo 'The testvalue is $testvalue'
  The testvalue is $testvalue
  [[email protected] sh]# echo "The testvalue is $testvalue"

  The testvalue is 100

        &和&&,|和||:

        &  表示任務在後臺執行,如要在後臺執行redis-server,則有  redis-server &
        && 表示前一條命令執行成功時,才執行後一條命令 ,如 echo '1‘ && echo '2'    
        | 表示管道,上一條命令的輸出,作為下一條命令引數,如 echo 'yes' | wc -l
        || 表示上一條命令執行失敗後,才執行下一條命令,如 cat nofile || echo "fail"

        grep 文字搜尋,見 http://man.linuxde.net/grep

        awk是一種程式語言它在命令列中使用,但更多是作為指令碼來使用。 見 http://man.linuxde.net/awk

        awk -F'[: =]' '{print $9}'     //  -F 'xxx' 表示以xxx為欄位分割符,F'[: =]'表示以:、空格、=為分隔符分割,也可以通過正則表示式+號如-F'[:]'+' '實現多分隔符,{print $9}表示列印分割出來的第9個欄位

        sort將檔案進行排序,並將排序結果標準輸出。見 http://man.linuxde.net/sort

        uniq用於報告或忽略檔案中的重複行,一般與sort命令結合使用。 見 http://man.linuxde.net/uniq

        uniq刪除的所謂的重複項是指連續出現的相同記錄項,sort |uniq等同於sort -u,先排序後刪除,會將全部文字重複項刪除

        使用-z "$ttl" 判斷字串是否為空 (或! -n "$ttl")

        cat $LOG >> $PINGLOG 將LOG檔案中的內容追加到PINGLOG最後

        label=$(($label+1))實現整形變數自加1

        tee同時輸出到檔案

        > $LOG 清空檔案 ,./當前目錄

        ping -c 2 -i 0.1 -W 100 :發2個包,時間間隔0.1秒,超時時間100ms

#!/bin/sh
ip="192.168.1."
LOG=./templog
LIST=./iplist
PINGLOG=./pinglog
label=1
> $LOG
> $LIST
> $PINGLOG
for i in `seq 1 254`
do
   ping -c 1 -i 0.2 $ip$i > $LOG
   cat $LOG >> $PINGLOG
   okip=`cat $LOG | grep "ttl=" | awk -F '[: =]' '{print $4}'|sort |uniq`
   ttl=`cat $LOG | grep "ttl=" | awk -F '[: =]' '{print $9}'|sort |uniq`
   if  [ ! -n "$ttl" ];
	then	echo "no reply"
   elif	[ "$ttl" -eq 64 ];
	then    echo  "Host $label $okip is linux" | tee -a $LIST
	label=$(($label+1))
   elif [ "$ttl" -eq 128 ];
	then	echo  "Host $label $okip is windows" | tee -a $LIST
	label=$(($label+1))
   else
        echo  "Host $label $okip is other deviece, ttl=$ttl" | tee -a $LIST
	label=$(($label+1))
   fi
done