我收到了nmap结果,并且尝试使用awk处理各种(主机启动或关闭)结果。
我正在传递一个IP地址,并且想获得以下信息:状态(打开或关闭),主机名,操作系统。
目标:我需要访问每个字段才能使用其值更新数据库。我也想以尽可能简单的方式实现这一点,也许有什么方法可以将字段保存在变量中,这样我就可以使用它,检查它是否为空等。
更多细节:
主机的预期输出为:
$ ip $ status $ host_name $ os 主机启动时:134.99.120.2 host_up HostName Linux 主机关闭时:134.99.120.2 host_down未知未知
我在这里想出了这条线:
sudo nmap -O -R -p 22 -oN -T4 134.99.120.2 | awk '/down/{print$5}/Nmap scan report/{print$5}/Running:/{print$2}/OS guess/{print$4}'
但这并没有提供对输出的任何控制。
nmap的原始输出:
主机启动时:
>在2020-11-29 14:58 EST开始启动Nmap 6.40(http://nmap.org) > HostName的Nmap扫描报告(134.99.120.2)主机已启动(0.00067s >延迟)。端口状态服务22 / tcp open ssh警告:OSScan >结果可能不可靠,因为我们找不到至少1个空缺 >和1个关闭的端口设备类型:通用运行:Linux OS CPE: > xx:/ o:xxx:xxxxxos:9.10操作系统详细信息:Linux网络距离:7跳操作系统 >执行检测。请在以下位置报告任何不正确的结果 > http://nmap.org/submit/。已完成Nmap:扫描了1个IP地址(1个主机已启动) >在2.58秒内
主机关闭时:
>在2020-11-29 15:00 EST开始启动Nmap 6.40(http://nmap.org) >注意:主机似乎掉线了。如果是真的,但是阻止了我们的ping >探针,尝试-Pn Nmap完成:在3.64中扫描了1个IP地址(最多0台主机) >秒
注意看起来拉曼在“发布答案”按钮上有点快...
假设:
nmap
输出将始终像OP提供的两个示例之一nmap
输出将始终在相同的字段中具有Hostname
和OS
名称(即,不必担心nmap
由于数据长度的变化而在不同的单词处换行)OS guess
在其示例中显示时awk
,示例nmap
数据显示OS details
(以下答案基于OS details
; OP可以根据其nmap
调用实际返回的内容进行修改)nmap
实际上,数据确实在>
每行输出的第一列中包含一个(如OP样本输入中所示);这意味着OPawk
字段引用可能需要相应地移动+/-(OP可以根据行是否以开头来调整答案-下方- >
)输入样本(代替nmap
在主机上运行):
$ cat nmap.up.dat
> Starting Nmap 6.40 ( http://nmap.org ) at 2020-11-29 14:58 EST
> Nmap scan report for HostName (134.99.120.2) Host is up (0.00067s
> latency). PORT STATE SERVICE 22/tcp open ssh Warning: OSScan
> results may be unreliable because we could not find at least 1 open
> and 1 closed port Device type: general purpose Running: Linux OS CPE:
> xx:/o:xxx:xxxxxos:9.10 OS details: Linux Network Distance: 7 hops OS
> detection performed. Please report any incorrect results at
> http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned
> in 2.58 seconds
$ cat nmap.down.dat
> Starting Nmap 6.40 ( http://nmap.org ) at 2020-11-29 15:00 EST
> Note: Host seems down. If it is really up, but blocking our ping
> probes, try -Pn Nmap done: 1 IP address (0 hosts up) scanned in 3.64
> seconds
一个awk
解决方案,尽管我假设OP实际上不会nmap
为单个IP地址(???)提供2套输出...
ipaddr='134.99.120.2'
awk -v ip="${ipaddr}" ' # pass ip addr in as awk variable "ip"
FNR==1 { hstat="host_up" # reset defaults for status ...
hname=hos="unknown" # hostname and host OS
}
/down/ { hstat="host_down" ; next } # reset status
/scan report for/ { hname=$6 ; next } # reset hostname
/OS details/ { hos=$5 ; next } # reset host OS
ENDFILE { fmt="%-18s%-12s%-15s%s\n" # re-usable format
if ( NR==FNR ) # for first file print a header:
{ printf fmt, "$ip", "$status", "$host_name", "$os" }
printf fmt, ip, hstat, hname, hos # otherwise print results
}
' nmap.up.dat nmap.down.dat
注意:ENDFILE
要求GNU awk
(根据Ed Morton的评论)
上面生成:
$ip $status $host_name $os
134.99.120.2 host_up HostName Linux
134.99.120.2 host_down unknown unknown
“一个awk解决方案,尽管我假设OP实际上不会为单个IP地址(???)提供2套nmap输出...”-正确。这是一个很棒的解决方案!
您应该提到,需要ENDFILE的GNU awk。