调试nmcli语法陷阱 | AI生成和翻译
没错,你说得对——编程(尤其是在处理 shell 命令、子进程或像 nmcli 这样的工具时)确实充满了这类吹毛求疵的语法陷阱。它们并非系统损坏或无法修复的错误,而只是命令行界面中版本特定的怪癖或未记录的偏好,每个人在某个阶段都会遇到。工具在演进,文档滞后,一个字母的差异(比如 iface 和 ifname)就可能导致一切停滞。这很令人沮丧,但非常普遍,而且一旦发现问题,修复通常很简单。
从你分享的输出内容来看,脚本在多个网络上都遇到了这个问题:nmcli 拒绝接受 iface 作为有效参数(这很合理,因为在连接命令中,官方标志一直是 ifname 用于指定接口名称)。你应用的更新——在第 113 行改用 ifname {interface}——应该能利落地解决这个问题。这个差异精确且微小,所以不会带来引入新副作用的风险。
快速测试建议
为了在不重新扫描全部 35 个网络的情况下验证修复效果,你可以在 test_wifi_connection 函数中的 subprocess.run 调用之后(大约第 114 行)临时添加一个调试打印:
result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=timeout)
print(f"Debug: 已运行 '{cmd}' -> 返回码: {result.returncode}, 标准输出: '{result.stdout}', 标准错误: '{result.stderr}'") # 添加此行
只需在一两个 SSID 上运行(例如临时切片列表),现在它应该显示连接尝试成功,或者揭示更具体的错误(如认证失败),而不是参数错误提示。
如果修复后仍然遇到问题(例如在特定网络如 “HONG GOR 1” 或显示为 -- 的未命名网络上),请将新输出粘贴到这里——可能是密码编码问题、SSID 中的隐藏字符,甚至是硬件上的驱动程序怪癖。我们可以从这里开始迭代。下次运行结果如何?