如何从nmap中提取开放端口号

问题描述 投票:0回答:1

现在我的目标是扫描单个 ip 并仅获取以逗号分隔的单行打印的开放端口。 下面的代码做到了这一点,但它在最后注入了 % 目标是在单行中实现端口号作为输出,而无需最后 2 个字符(最后一个逗号和 % 符号)

sudo nmap -vv -sS 10.129.208.16 -oG  - | awk -v OFS=':' '
/open/ {
  for (i=4;i<=NF;i++) {
    split($i,a,"/");
    if (a[2]=="open") {printf a[1]","}
  }
}'

输出:

21,22,53,80,139,443,445,%

所需输出:

21,22,53,80,139,443,445
linux shell awk scripting nmap
1个回答
1
投票

通过使用

printf

{printf a[1]","}

就像这样,如果

a[1]
持有模板并需要填充 1 个或多个位置,则您将面临故障风险,请考虑

echo "%s/%s" | awk '{split($0,a,"/");printf a[1]","}'

由于填充位置的值不足,将导致致命错误。更稳健的解决方案是自己提供模板

echo "120/60" | awk '{split($0,a,"/");printf("%s,",a[1])}'  # outputs 120,
echo "%s/%s" | awk '{split($0,a,"/");printf("%s,",a[1])}'  # outputs %s,

目标是获得端口号

为此,您可以添加条件检查

a[1]
是否为整数,并修复上述问题并给出代码

sudo nmap -vv -sS 10.129.208.16 -oG  - | awk -v OFS=':' '
/open/ {
  for (i=4;i<=NF;i++) {
    split($i,a,"/");
    if (a[2]=="open"&&a[1]~/^[0-9]+$/) {printf("%s,",a[1])}
  }
}'

说明:仅当

printf
打开且 (
a[2]
)
&&
具有一个或多个 (
a[1]
) 位数字 (
+
) 时,从开始 (
[0-9]
) 到结束 (
^
)即
$
仅由数字组成,并且至少有 1 位数字。
免责声明:由于缺少主要命令的输出,我无法测试。

如果您想了解更多关于

a[1]

用法的信息,请阅读

使用 
printf 高级打印声明

    

© www.soinside.com 2019 - 2024. All rights reserved.