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
4

2 回答 2

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最终会在一个子 shell 中并且不能修改父级的变量),以及一对正则表达式来提取你需要的信息。

如果您需要更多输出,以后可以轻松扩展。

于 2013-07-16T17:51:23.213 回答
0

你有点把事情复杂化了。您的命令可以这样重写:

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

一些解释:

  • 我们使用进程替换(使用<( )将命令的输出作为参数重定向到 grep 命令。
  • 如果找到匹配项,则 grep 命令返回零,否则返回非零。因此,我们可以直接在 if 语句中使用它

你也可以像这样避免 if all together:

grep "1 host up" <(nmap -O "$i") && echo "UP" || echo "DOWN"
于 2013-07-16T16:30:42.707 回答