2013-07-16 55 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结束并且不能修改父变量)和一对正则表达式来提取您需要的信息。

如果您需要更多的输出,容易延长。