Bash 中的并行迭代 IP 地址

2023-11-23

我正在处理一个大型私有 /8 网络,需要枚举正在侦听端口 443 并在其 HTTP HEADER 响应中声明特定版本的所有 Web 服务器。

一开始我想跑nmap使用 connect 扫描并通过输出文件 grep 自己,但这会引发许多误报nmap声明一个端口被“过滤”,而它实际上是“打开”的(使用连接扫描:nmap -sT -sV -Pn -n -oA foo 10.0.0.0/8 -p 443).

所以现在我想用 bash 编写一些脚本curl- 伪代码如下:

for each IP in 10.0.0.0/8  
do:  
    curl --head https://{IP}:443 | grep -iE "(Server\:\ Target)" > {IP}_info.txt;  
done  

由于我不太熟悉 bash,我不确定如何正确编写脚本 - 我必须:

  • 循环遍历所有IP
  • 确保只有 X 个威胁并行运行
  • 理想情况下,将输出剪切为仅在一个文件中记下匹配主机的 IP
  • 最好确保只记录匹配的服务器版本

任何建议或指出方向都将受到高度赞赏。


小规模 - 迭代

for a smallerIP 地址跨度可能会建议像这样迭代:

for ip in 192.168.1.{1..10}; do ...

如本文所述类似的问题.


大规模-并行!

鉴于您的问题涉及hugeIP 地址跨度您可能应该考虑采用不同的方法。

This begs供使用gnu并行.

使用 bash 在 bash 中并行迭代大范围的 IP 地址gnu并行需要将逻辑拆分为多个文件(供并行命令使用)。

ip2int

#!/bin/bash

set -e

function ip_to_int()
{
  local IP="$1"
  local A=$(echo $IP | cut -d. -f1)
  local B=$(echo $IP | cut -d. -f2)
  local C=$(echo $IP | cut -d. -f3)
  local D=$(echo $IP | cut -d. -f4)
  local INT

  INT=$(expr 256 "*" 256 "*" 256 "*" $A)
  INT=$(expr 256 "*" 256 "*" $B + $INT)
  INT=$(expr 256 "*" $C + $INT)
  INT=$(expr $D + $INT)

  echo $INT
}

function int_to_ip()
{
  local INT="$1"

  local D=$(expr $INT % 256)
  local C=$(expr '(' $INT - $D ')' / 256 % 256)
  local B=$(expr '(' $INT - $C - $D ')' / 65536 % 256)
  local A=$(expr '(' $INT - $B - $C - $D ')' / 16777216 % 256)

  echo "$A.$B.$C.$D"
}



scan_ip

#!/bin/bash

set -e

source ip2int

if [[ $# -ne 1 ]]; then
    echo "Usage: $(basename "$0") ip_address_number"
    exit 1
fi

CONNECT_TIMEOUT=2 # in seconds
IP_ADDRESS="$(int_to_ip ${1})"

set +e
data=$(curl --head -vs -m ${CONNECT_TIMEOUT} https://${IP_ADDRESS}:443 2>&1)
exit_code="$?"
data=$(echo -e "${data}" | grep "Server: ")
     # wasn't sure what are you looking for in your servers
set -e

if [[ ${exit_code} -eq 0 ]]; then
    if [[ -n "${data}" ]]; then
        echo "${IP_ADDRESS} - ${data}"
    else
        echo "${IP_ADDRESS} - Got empty data for server!"
    fi
else
    echo "${IP_ADDRESS} - no server."
fi



扫描范围

#!/bin/bash

set -e

source ip2int

START_ADDRESS="10.0.0.0"
NUM_OF_ADDRESSES="16777216" # 256 * 256 * 256

start_address_num=$(ip_to_int ${START_ADDRESS})
end_address_num=$(( start_address_num + NUM_OF_ADDRESSES ))

seq ${start_address_num} ${end_address_num} | parallel -P0 ./scan_ip

# This parallel call does the same as this:
#
# for ip_num in $(seq ${start_address_num} ${end_address_num}); do
#     ./scan_ip ${ip_num}
# done
#
# only a LOT faster!


迭代方法的改进:

原生 for 循环的运行时间(对于 256*256*256 个地址估计需要 200 天)改进为一天以内根据@skrskrskr。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 中的并行迭代 IP 地址 的相关文章

随机推荐

  • 使用 https 代理运行 AngularJS Protractor

    尝试运行量角器时 我在命令行中收到以下错误 gt 致命错误 量角器退出 代码 1 我需要代理到 https 测试服务器 我该如何实现这个目标 我听从了这个建议Github问题 但我仍然收到上述错误 这是我的配置文件 A reference
  • 如何使用 Allocations 将数组值传入和传出 Android RenderScript

    我最近一直在使用 RenderScript 目的是创建一个程序员可以轻松使用的 API 类似于 Microsoft Accelerator 的工作方式 我目前遇到的麻烦是 我想在 RenderScript 层之间传递值 并让所有内容以尽可能
  • 如何从 iPhone 视频录制中实时捕捉逐帧图像

    我正在尝试实时测量所选颜色的饱和度 如下所示 我正在关注本指南来自苹果 我更新了代码以使用 ARC 当然还使我的视图控制器成为AVCaptureVideoDataOutputSampleBufferDelegate 但我不知道如何实际开始捕
  • 如何在没有 BOM 的情况下重定向 PowerShell 中的输入?

    我正在尝试通过以下方式重定向 PowerShell 中的输入 Get Content input txt my program args 问题是管道 UTF 8 文本前面带有 BOM 0xEFBBBF 而我的程序无法正确处理它 一个最小的工
  • 如何从 R 编写 PostgreSQL 中的表?

    目前 要在 PostgreSQL 表中插入数据 我必须创建一个空表 然后执行insert into table values 连同数据框一起折叠成包含所有值的单个字符串 它不适用于大型数据帧 The dbWtriteTable 不适用于 P
  • 如何通过 C 预处理器打印磅/散列?

    我需要帮助执行以下操作 预处理器宏标签 x 应输出 x 例如 define label x 如果我调用 label aname 输出应为 aname 不带引号 我知道 以下尝试是错误的 define label x x leads to x
  • GCC 致命错误:stdio.h:没有这样的文件或目录

    我正在尝试使用 GCC 4 9 实验性 在 OS X 10 9 上用 C 编译程序 由于某种原因 我在编译时收到以下错误 gcc fatal error stdio h No such file or directory 然后我尝试了一个简
  • ASP.NET 与 WCF 聊天

    我正在寻找为 ASP NET 页面实现聊天室界面 我正在学习 WCF 它似乎适合聊天应用程序 在我深入研究 WCF 之前 我想确定它是在 ASP NET 中开发聊天应用程序的正确选择 有人可以提供任何反馈吗 我发现了一些主要使用 Silve
  • grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, 中的警告:字符 0x20 的字体宽度未知

    我想使用免费字体Lato in ggplot2因为我的 R markdown 文档的其余部分就是用这种字体设置的 该字体已安装在我的系统上 并且可以在字体簿中找到 只有一次 所有可用字体均加载extrafont封装并注册在extrafont
  • 使用 python 3.3.4 和 RotatingFileHandler 时出现 PermissionError

    我正在尝试为我使用 python 3 3 4 和 PyQt4 编写的 GUI 应用程序获取旋转日志文件 我的主脚本中有以下代码片段 import logging import resources logger logging getLogg
  • Angular - 构建模块的最佳实践

    我是角度新手 所以请耐心等待 前几天我正在阅读一篇文章 文档 其中强调了在应用程序中构建模块的最佳方法 但只能粗略地记住它 App controllers App services angular module App App contro
  • QTableView:更改双精度值的精度

    如果模型返回双精度值作为 EditRole 则 假设 QDoubleSpinBox 被 QTableView 用作编辑器 如何改变该控制的精度 解释了 QTableView 中 QDoubleSpinBox 的精度行为here 所以要解决这
  • JavaScript 字体规格

    给定 1 字体系列和 2 unicode 字符代码 是否可以在 JavaScript 中生成如下所示的图像 http www freetype org freetype2 docs tutorial metrics png 基本上 我想 显
  • 连接拒绝 MongoDB errno 111

    我有一个运行 Ubuntu 12 04 LTS 和 MongoDB 实例的 Linode 服务器 服务正在运行并且可以在本地连接 但我无法从外部源连接到该服务器 我已将这两条规则添加到我的 IP 表中 其中 是我想要连接的服务器 如本节中所
  • 在 POM 的 Maven 存储库条目中,默认情况下是否启用快照?

    A Maven POM可以定义一个 存储库 例如
  • 无法获取 BatchBridge,请确保您的捆绑包正确打包

    我正在尝试运行我创建的反应本机应用程序 当我最初在手机中运行它时 我看到以下屏幕 我尝试运行 react native start 当我运行它时 我得到以下输出 当它停止在 初始化包管理器 时 我在另一个终端中运行了 react nativ
  • 让 ffmpeg 与 Heroku 一起工作

    我尝试为我的 Heroku Rails 应用程序安装 ffmpeg 但现在我的应用程序崩溃了 我使用以下命令添加了一个构建包 heroku config add BUILDPACK URL https github com shunjiko
  • 从 .NET Windows 服务启动进程

    我正在尝试从 NET Windows 服务启动控制台应用程序 该服务在 Windows 2008 服务器上运行 我使用 Process Start 运行控制台应用程序并且它运行 我可以在任务管理器中看到它 但我从未取回进程 ID 并且对 P
  • R 中的 function(x):在不定义函数的情况下编写“函数”?

    我已经多次遇到这个概念 但不知道它的名称 因此无法通过谷歌搜索来了解更多信息 基本上 当查看其他人编写的函数甚至简单命令时 我经常会看到类似的内容 apply dataset 1 2 function x 10 x 在这种情况下 我能够以某
  • Bash 中的并行迭代 IP 地址

    我正在处理一个大型私有 8 网络 需要枚举正在侦听端口 443 并在其 HTTP HEADER 响应中声明特定版本的所有 Web 服务器 一开始我想跑nmap使用 connect 扫描并通过输出文件 grep 自己 但这会引发许多误报nma