内网ip扫描—终章

dfnb12367个月前110

在鸽了将近两个月之后,我终于用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?(差异篇)

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

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

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

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

FED5B—红色沙皇的没落

FED5B—红色沙皇的没落

根据年前的博客补文列表来看,我们这篇博文应该来讲fed5B了,这台相机是苏联很后面右转之后搞出来的。反正就是质量参差不齐,做工比较的粗犷,我的那一台已经坏了QAQ历史部分大家只需要知道,它从一代开始就...

白嫖!!!免费二级域名可托管到CF

白嫖!!!免费二级域名可托管到CF

本来说是要把带英游记写完的,但是没崩住把扫描仪卖了,这段时间也比较的忙就只能搁置一手啦QAQ那么我们这篇博文就来填白嫖二级域名的坑-----------------------------------...

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

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

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

凤凰205—最适合小白玩胶片的机器

凤凰205—最适合小白玩胶片的机器

距离我的上一篇博文已经差不多过去了4个月了在这段时间里我稍微有点沉迷摄影也就有了这一片博文,也就是我的第一台胶片机也是我的第一台相机凤凰205d或许各位同志们会疑惑?不是说推荐205吗那后面的D是什么...

发表评论    

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