如何在不使用 for 循环的情况下将多行传递给参数?

如何在不使用 for 循环的情况下将多行传递给参数?

我有以下命令来处理 nmap 输出,其中包含要求我扫描的 ip 列表:

cat ping-sweep.txt | grep "report for" | cut -d " " -f5

这为我提供了仅包含 IP 的列表(每行一个),然后我想扫描 Web 服务器。

我可以使用以下命令扫描单个主机:

nmap -v -p 80,443,8080 10.1.1.1

我想对列表中的每个 IP 执行此扫描,但是将其通过管道传输到 nmap 似乎不起作用。我是否需要创建一个带有 a 的 bash 脚本来foreach执行此操作,或者是否缺少一些简单的东西?

答案1

您可以将nmap所有要扫描的地址作为参数给出,如下所示:

nmap -v -p 80,443,8080 $(grep "report for" ping-sweep.txt | cut -d" " -f5)

grep在您的文件上运行(不需要cat),然后grep通过 过滤 的输出cut,其结果用于构建nmap命令行。这被称为命令替换

shell 中有循环,您可以通过多种方式使用循环:

grep "report for" ping-sweep.txt | cut -d" " -f5 | while read ip; do
    nmap -v -p 80,443,8080 "${ip}"
done

或者

for ip in $(grep "report for" ping-sweep.txt | cut -d" " -f5); do
    nmap -v -p 80,443,8080 "${ip}"
done

nmap这两者都一次仅使用一个地址运行。

答案2

第一步是尝试按照 Nmap 的设计方式使用它。由于 Nmap 在每次端口扫描之前执行主机发现(“ping 扫描”),因此您可以使用以下简单命令同时执行这两个步骤:

nmap -p 80,443,8080 [TARGETS]

如果您确实需要与端口扫描分开执行主机发现,请使用 Nmap 强大的机器可读输出选项,例如XML或者格雷普布尔输出。对于旧版本的 Nmap,最简单的方法是进行主机发现并保存 Grepable 输出,如下所示:

nmap -sn [TARGETS] -oG ping-sweep.gnmap

然后你可以使用 awk 轻松提取 IP 地址:

awk '/Status: Up/{print $2}' ping-sweep.gnmap > targets.txt

并将它们直接导入到Nmap:

nmap -p 80,443,8080 -iL targets.txt

或者,使用 Nmap 7.00 或更高版本,您可以使用保存的 XML 输出格式-oX ping-sweep.xml目标-xmlNSE脚本:

nmap -p 80,443,8080 --script targets-xml --script-args newtargets,iX=ping-sweep.xml

使用这些选项中的任何一个,如果您的主机发现扫描足够新,您可以添加-Pn选项以跳过端口扫描的主机发现阶段。这可以节省一点点扫描速度,因为您应该能够指望那些相同的主机仍然处于运行状态。

你什么确实不应该做是任何涉及循环 或 的解决方案xargs,因为它们最终将为每个目标启动一个单独的 Nmap 实例。这是浪费且不必要的,因为每个实例都必须重复加载数据文件和发送定时探测以监视网络容量的工作,并且单独的实例将相互竞争网络资源而不是合作。此外,您最终还必须重新组合它们单独的输出。

答案3

最一般地,您可以xargs将每一行作为命令行参数传递给命令,如下所示:

cat ping-sweep.txt | grep "report for" | cut -d " " -f5 | xargs -I'{}' nmap -v -p 80,443,8080 '{}'

相关内容