对于需要经常组建局域网的人来说,获取每台设备的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!