内网ip扫描—终章

dfnb12366个月前未分类83

在鸽了将近两个月之后,我终于用python写了个内网脚本出来,接下来我应该会把她开源到github上OvO

import os
import platform
import ipaddress
import argparse
import subprocess
from concurrent.futures import ThreadPoolExecutor, as_completed

SYSTEM = platform.system().lower()

# ---------- 1. ping ----------
def build_ping_cmd(host: str, timeout_ms: int) -> str:
    if SYSTEM == "windows":
        return f"ping -n 1 -w {timeout_ms} {host} >NUL 2>&1"
    else:
        timeout_s = max(1, timeout_ms // 1000)
        return f"ping -c 1 -W {timeout_s} {host} >/dev/null 2>&1"

def ping_host(host: str, timeout_ms: int) -> bool:
    return os.system(build_ping_cmd(host, timeout_ms)) == 0

# ---------- 2. 名称解析 ----------
def get_name(host: str) -> str:
    """
    先尝试 nslookup,再尝试 nbtstat(Windows)或 smbclient(Linux)
    返回解析到的第一个名字,失败则返回空串
    """
    # 1. nslookup
    try:
        out = subprocess.check_output(
            ["nslookup", host], timeout=3, stderr=subprocess.DEVNULL
        ).decode(errors="ignore")
        for line in out.splitlines():
            line = line.strip()
            if line.lower().startswith("name:"):
                return line.split()[1].rstrip(".")
    except Exception:
        pass

    # 2. Windows 专用 nbtstat
    if SYSTEM == "windows":
        try:
            out = subprocess.check_output(
                ["nbtstat", "-A", host], timeout=3, stderr=subprocess.DEVNULL
            ).decode(errors="ignore")
            for line in out.splitlines():
                line = line.strip()
                if "<00>" in line and "UNIQUE" in line:
                    return line.split()[0]
        except Exception:
            pass
    return ""

# ---------- 3. 扫描 ----------
def sweep(network: str, timeout_ms: int, workers: int):
    try:
        net = ipaddress.ip_network(network, strict=False)
    except ValueError as e:
        print("网段格式错误:", e)
        exit(1)

    alive = []
    print(f"开始扫描 {network},并发:{workers},超时:{timeout_ms} ms\n")
    with ThreadPoolExecutor(max_workers=workers) as pool:
        future_map = {pool.submit(ping_host, str(ip), timeout_ms): ip for ip in net.hosts()}
        for f in as_completed(future_map):
            ip = str(future_map[f])
            if f.result():
                name = get_name(ip)
                alive.append((ip, name))
                print(f"[+] {ip:<15}  {name or '--'}")
    print(f"\n扫描完成,存活 {len(alive)} 台:")
    for ip, name in alive:
        print(f"{ip:<15}  {name or '--'}")
    return alive

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="网段存活扫描 + 设备名称")
    parser.add_argument("network", help="例:192.168.1.0/24")
    parser.add_argument("-w", "--timeout", type=int, default=500, help="ping 超时毫秒,默认 500")
    parser.add_argument("-c", "--concurrency", type=int, default=100, help="并发数,默认 100")
    args = parser.parse_args()
    sweep(args.network, args.timeout, args.concurrency)

使用方法是:

python 脚本名.py 网段/24 -w 最大毫秒数 -c 线程

比如:

python sweep_with_name.py 192.168.1.0/24 -w 600 -c 50


博客网址:blog.5948888.xyz

B站:此生只为芭芭拉

未经允许请勿转载

相关文章

都5202年啦,你还在用windows?(目录篇)

都5202年啦,你还在用windows?(目录篇)

那么好,距离上一篇博文好像已经过去了114514天了 (其实只是两个月),我不得不来更新这个系列的第二篇了,所以在这第二篇我们会来聊聊linux的文件目录结构 (感觉和第一篇有点本末倒置了捏),不过这...

都5202年啦,你还在用windows?(差异篇)

都5202年啦,你还在用windows?(差异篇)

距离上一篇博文已经过了差不多两个月了,很不幸月更目前看来因该是失败了捏,那么我们这一篇博文就来谈一谈操作系统8 OvO知周所众 windous10 因为巨硬微软的调整正式的完成了她的生命周期,也就是说...

详解简单arp攻击---图形化断网神器

详解简单arp攻击---图形化断网神器

观前提示:请遵守各国法律法规,本教程仅限于网安测试,一切后果本人概不负责。本篇博文是本年的第二篇博文,最近事情比较繁忙,补文列表可能要无限期后延QAQ但是在本篇博文中我将介绍一个好玩意,即arp妙妙工...

使用openfrp无需实名内网穿透加雨云二级域名免费建站(z-blog)小白向

使用openfrp无需实名内网穿透加雨云二级域名免费建站(z-blog)小白向

HI,大家好我是芭芭拉这片文章我来教大家如何在不到一个小时的时间里,零基础搭建一个个人博客或者论坛。在这里我们需要用到这几样东西z-blog源码网址:zblogcn.comphpstudy网址:xp....

垃圾佬神机----1300左右最强配置

垃圾佬神机----1300左右最强配置

uu们,我配新电脑了所以内网IP扫描先鸽一段时间,我们里唠唠捡垃圾OvO差不多在最早的几个博文中说到了我要配新电脑,但是由于一些事情就搁置了(主要是没有钱)但是就在不久前我的心态发生了转变咱们正经主机...

详解内网IP扫描--谈谈ping命令

详解内网IP扫描--谈谈ping命令

距离上一篇文章也差不多一个月了,所以今天来填坑上一篇说这一篇会写内网IP扫描相关的知识,所以我们来聊一聊Ping命令既然说到Ping命令,那么想当然的会令人发出疑问:怎么使用这个命令呢?实际上非常简单...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。