解析外部命令输出并保存为变量

时间:2013-07-16 16:20:18

标签: bash parsing scripting grep nmap

我正在尝试创建一个可以针对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

2 个答案:

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

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

答案 1 :(得分: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"