注意,本文不是破解 WIFI 密码,当然你把程序发给别人再获取对方密码,那是社会工程学。
subprocess
模块介绍这篇博客给大家带来一个小小的案例,使用 Python 脚本获取本地电脑记录的所有 Wifi 密码。
先介绍一下用到的模块 subprocess
,看模块名就知道这是进程模块,它可以让我们生成新的进程,并对进行进行管理。
模块中的常用函数,如下所示。
subprocess.run()
:执行指定命令,等待执行完成后返回一个包含执行结果的 CompletedProcess 类对象;subprocess.call()
:执行指定命令,返回命令执行状态,与 os.system(cmd)
功能类似;subprocess.check_call()
:执行指定命令,如果执行成功返回状态码,否则抛出异常;subprocess.check_output()
:执行指定命令,如果执行状态码为 0,返回执行结果,否则抛出异常;subprocess.getoutput()
:接收字符串格式的命令,执行并返回执行结果,与之相同的函数有 os.popen(cmd).read()
;subprocess.getstatusoutput()
:执行命令,返回一个元组(命令执行状态,命令执行结果)。使用这个模块还有一些注意事项。
subprocess.run()
;subprocess.Popen()
实现的高级函数,所以想实现复杂功能,可以通过它来实现;subprocess.getoutput()
和 subprocess.getstatusoutput()
安全性较低。既然优先使用 subprocess.run()
方法,那我们看一下其语法格式。
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)
参数说明如下:
args
:要执行的 shell 命令,需要传入字符串或者字符串参数列表;stdin
,stdout
,stderr
:子进程的标准输入,输出和错误;timeout
:命令超时时间;check
:默认为 False,如果设置为 True,则当进程退出状态码不是 0 的时候,抛出 CalledProcessError
异常;encoding
:如果设置该参数,则 stdin
,stdout
,stderr
可以接收字符串数据,并以该编码进行编码,否则只接收字节类型数据;shell
:设置命令是否通过 Shell 执行。有些这些基础参数说明之后,就可以调用最简单的 Shell 命令了,例如查看本地 pip 包安装清单。
import subprocess
subprocess.run(["pip","list"])
运行代码,自行查看结果,当然也可以把返回值捕获到一个变量中,查看一下返回对象类型。
import subprocess
ret = subprocess.run(["pip","list"])
print(ret)
输出结果如下所示:
CompletedProcess(args=['pip', 'list'], returncode=0)
此时返回的是 CompletedProcess
类的对象实例,它表示的是结束进程之后的状态心虚,包含如下属性。
args
:该进程执行的命令;returncode
:退出状态码,为 0 表示进程成功运行,负值-N 表示进程被信号 N 终止;stdout
:从进程捕获到的输出信息;stderr
:从进程捕获到的错误信息。有了上述知识铺垫之后,就可以完成 Python 获取本地 Wifi 密码案例了
获取本地 wifi 密码,先通过 CMD 命令实现,分为两步,如下所示。
第一步,获取所有用户配置文件,其结果为当前电脑连接过的 wifi 名称。
netsh wlan show profiles
得到的结果如下所示。
这里仅在本机中找到了一个配置文件 realme GT Neo2T
,然后通过下述命令查看 Wifi 密码。
第二步,获取上述配置文件对应的密码。
netsh wlan show profile name="realme GT Neo2T" key=clear
可以在运行结果中找到保存密码,如下所示。
有了上述两条 CMD 命令,我们将其应用到 Python 中,就实现了本案例诉求。
将 CMD 命令翻译为 Python 代码,首先获取所有 wifi 信息。
import subprocess
# 获取本机wifi列表
output = subprocess.run(['netsh', 'wlan', 'show', 'profiles'], capture_output=True).stdout.decode('gbk').split('\n')
print(output)
wifi_list = [item.split(':')[1][1:-1] for item in output if "所有用户配置文件" in item]
print(wifi_list)
接下来执行第二条命令,获取指定 wifi 密码。
# 获取 wifi 密码
for wifi in wifi_list:
ret = subprocess.run(['netsh', 'wlan', 'show', 'profile', f'name={wifi}', 'key=clear'],
capture_output=True).stdout.decode('gbk', errors='ignore').split('\n')
print(ret)
results = [item.split(':')[1][1:-1] for item in ret if "关键内容" in item]
print(f'{wifi} 密码:{results[0] if len(results)>0 else "无" }')
最终的运行结果如下所示。
realme GT Neo2T 密码:12345678
完成本案例!
你正在阅读 【梦想橡皮擦】 的博客
阅读完毕,可以点点小手赞一下
发现错误,直接评论区中指正吧
橡皮擦的第 752 篇原创博客
从订购之日起,案例 5 年内保证更新