局域网IP搜索小工具

  对于需要经常组建局域网的人来说,获取每台设备的IP地址是必须的。但是有的时候你是没有办法获取到网关设备的管理权限的,如果是有显示屏的设备还好说,直接本地查看IP地址就好了。一旦没有显示屏,一切就会显得有些麻烦,这时恐怕只能提前设置固定IP了。这就是我写这个Python小工具的原因啦。

  其实这个小工具的开发原理非常简单,仅仅只是利用了一下arp列表,如果你懂arp指令的话,直接命令行操作就能解决问题了٩(ˊᗜˋ*)و。

  • 工具首先会利用 ‘arp -d’ 清除一下arp列表,这时需要管理员权限;
  • 然后循环ping所有网段中的IP,重建arp列表;
  • 最后利用正则表达式匹配MAC地址,获取对应的IP地址。

  使用的时候直接运行.exe文件就好了,完全绿色无污染~ 工程文件和exe执行档我都上传到我的GitHub(GodenX)了。

下面贴一下Python源码:

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Time    : 2019/2/16 8:59
# @Author : Jackie Yang
# File    : Search_all_IP_in_LAN.py
# Project : Search_all_IP_in_LAN
# Version : v0.1

from progressbar import *
import os
import re
import time


def arp_del():
    with open("./temp.bat", "w", newline='') as bat:
        bat.write(
            '''@echo off\r\n%1 %2\r\nver|find "5.">nul&&goto :st\r\nmshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :st","","runas",1)(window.close)&goto :eof\r\n:st\r\ncopy "%~0" "%windir%\system32\\"\r\narp -d''')
    os.system('cmd.exe /c ' + os.path.dirname(os.path.abspath(__file__)) + r'\temp.bat')
    os.remove('temp.bat')


def run():
    arp_del()
    # noinspection PyBroadException
    try:
        var = os.popen("arp -a").read()
        ip_address = re.search(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", var, flags=0).group()
        print("本机IP: ", ip_address)
        var = ip_address.split(".")
        ip = var[0] + "." + var[1] + "." + var[2] + "."
    except Exception as e:
        print(e)
        return
    # noinspection PyBroadException
    try:
        mac = input("请输入MAC地址(以‘-’间隔):").lower()
        mac = re.search(r"[a-zA-Z0-9]{1,2}\-[a-zA-Z0-9]{1,2}\-[a-zA-Z0-9]{1,2}\-"
                        r"[a-zA-Z0-9]{1,2}\-[a-zA-Z0-9]{1,2}\-[a-zA-Z0-9]{1,2}", mac, flags=0).group()
    except Exception as e:
        print("输入错误!")
        return
    print("MAC: %s" % mac)
    progress = ProgressBar()
    for i in progress(range(1, 256)):
        os.popen("ping -n 1 " + ip + str(i))
        time.sleep(0.01)
    var = os.popen("arp -a").read()
    l = var.split(" ")
    for i in range(len(l)):
        if l[i] == mac:
            for j in range(1, 20):
                if l[i - j] != "":
                    print("IP地址:", l[i - j])
                    break
            break
    else:
        print("MAC不在局域网中!")


if __name__ == "__main__":
    try:
        run()
    except Exception as e:
        print(e)
    finally:
        input("输入 Enter 退出")

  其实这个小脚本还有一个需要改进的地方,不知道是Pyinstaller的原因还是什么其他原因,我利用了Windows自带的库并没有能够获取到管理员权限。我仅仅只是使用了一个折中的办法,利用Python脚本生成了一个temp.bat批处理文件,在这个文件中申请管理员权限,在运行完后再删除它。如果有朋友能够帮忙解决一下,欢迎博客下留言或者直接GitHub留言,谢谢!

Enjoy it!

上一篇:最常用正则表达式!


下一篇:在SQLSERVER中处理特殊字符以及空格。