现在我的目标是扫描单个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
通过使用
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
高级打印声明
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
多个主机。