2013-07-16 77 views
1

我正在試圖製作一個腳本,它可以針對一個ip運行nmap並告訴我主機是否啓動以及操作系統。我希望主機和操作系統的細節成爲唯一的輸出。解析外部命令輸出並保存爲變量

ip=$1 
nmap -O $ip |while read -r line; do 
if [[ `echo $line|grep "1 host up"`] !=0] 
then 
    echo "1 Host is up" 
else 
    echo "No Host" 
fi 
done 

我在這個非常糟糕的,所以任何幫助,您可以給我將不勝感激:)

編輯:樣品NMap的輸出要求

Starting Nmap 5.21 (http://nmap.org) at 2013-07-16 13:18 EDT 
Nmap scan report for hostname.domain.com (192.168.1.5) 
Host is up (0.00028s latency). 
Not shown: 997 closed ports 
PORT STATE SERVICE 
135/tcp open msrpc 
139/tcp open netbios-ssn 
445/tcp open microsoft-ds 
MAC Address: 78:2B:CB:7E:C7:74 (Unknown) 
Device type: general purpose 
Running: Microsoft Windows XP 
OS details: Microsoft Windows XP SP2 or SP3, or Windows Server 2003 
Network Distance: 1 hop 

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ 
Nmap done: 1 IP address (1 host up) scanned in 2.44 seconds 

回答

0

您在複雜的過事情有點。你的命令可以重新寫成這樣:

if grep "1 host up" <(nmap -O "$i") 
then 
    echo "UP" 
else 
    echo "DOWN" 
fi 

幾點說明:

  • 我們使用process substitution(與<()到命令的輸出重定向作爲參數傳遞給grep命令
  • grep命令如果找到匹配則返回零,否則返回非零。因此,我們可以直接在if語句中使用它

您可以也避免瞭如果一起這樣的:

grep "1 host up" <(nmap -O "$i") && echo "UP" || echo "DOWN" 
+0

非常感謝!上半場對我有幫助。是否有可能讓我在變量中的主機詳細信息或至少回顯它們? – user163161

+0

@ user163161究竟是哪個細節?你的意思是'操作系統細節:'? – user000001

+0

對不起,我以爲我鍵入操作系統的詳細信息...大腦放屁.. – user163161

2

這裏的東西,你可以嘗試:

#! /bin/bash 

host=whatever 

while read -r line ; do 
    if [[ $line =~ ([0-9])+\ hosts?\ up ]] ; then 
     host_up="${BASH_REMATCH[1]}" 
    elif [[ $line =~ OS\ details:\ (.*) ]] ; then 
     host_os="${BASH_REMATCH[1]}" 
    fi 
done < <(nmap -O $host) 

echo "Up: $host_up OS: $host_os" 

這使用過程中替換來這裏開車while循環(必要 - 如果你這樣做nmap | whilewhile結束並且不能修改父變量)和一對正則表達式來提取您需要的信息。

如果您需要更多的輸出,容易延長。