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

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

现在我的目标是扫描单个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
2个回答
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 高级打印声明

    


0
投票

printf

也许有 venv?

pip install --user yq

(如果您使用 venv,您可以直接获取 activate 脚本以便将来再次使用它,然后只需运行 
sauer@host:~$ python -m venv ~/dev/yq sauer@host:~$ . ~/dev/yq/bin/activate (yq) sauer@host:~$ pip install yq

即可退出 venv 环境)

然后,使用 jq Skillz 从 XML 输出中选择所需内容,并在串行模式 (

deactivate

) 下使用

paste
与逗号分隔符 (
-s
) 组合输出。
-d,

当 192.168.0.0 时,这给了我这个。被替换为在多个端口上侦听的实际机器:
sudo nmap -vv -sS 192.168.0.0 -oX - | xq -r ' .nmaprun.host | .ports.port[] | select( .state."@state" == "open" ) | ."@portid" ' | paste -s -d,

我在主机和端口之间放置了一个管道,因为主机变成了一个列表,因此需要 

22,25,53,80,88,111,139,389,443,445,514,631,1080,2049,3000,3128,3306,3493,5432,8001,8080,8443,9090,9101,10000

多个主机。

    

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