我正在尝试创建一个可以针对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 :(得分: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 | while
,while
最终在子shell中,并且不能修改父变量),以及一对正则表达式来提取您需要的信息。
如果您需要更多输出,可以在以后轻松扩展。
答案 1 :(得分:0)
你的东西过于复杂了。您的命令可以像这样重写:
if grep "1 host up" <(nmap -O "$i")
then
echo "UP"
else
echo "DOWN"
fi
一些解释:
<( )
将命令输出重定向为grep命令的参数。你也可以像这样避免所有这些:
grep "1 host up" <(nmap -O "$i") && echo "UP" || echo "DOWN"