如何让NetworkManager每次连接有线网络时询问802.1x身份/用户名
我明白你的困扰——NetworkManager在802.1x PEAP+MSCHAPv2的认证配置里,确实没有像密码那样直接提供「每次询问用户名」的选项:GUI里找不到相关设置,用nmcli尝试把802-1x.identity设为空值还会因为字段必填报错,就连临时设个"anon"也没效果。
下面给你几个可行的思路,从相对“干净”的配置尝试到优化你自己的工具都有:
一、尝试手动编辑NetworkManager配置文件
NetworkManager的连接配置文件存放在/etc/NetworkManager/system-connections/目录下(需要root权限才能编辑)。找到你的有线连接对应的.nmconnection文件,打开后定位到[802-1x]小节:
- 先删除现有的
identity=行 - 添加一行
identity-flags=2(这个参数的作用和密码的password-flags=2类似,标记为需要每次询问) - 确保已经设置了
password-flags=2(你已经配置了这个,用来每次弹出密码输入框)
保存文件后,执行nmcli c reload让NetworkManager重新加载配置,然后尝试连接。不过要注意,部分版本的NetworkManager可能对identity-flags的支持有限,尤其是PEAP认证场景,如果这个方法不行,就试试下面的方案。
二、优化你的自定义认证工具
你写的那个wxPython小工具其实是个很实用的替代方案,而且可以做些小优化让它更健壮:
- 替换
os.system为subprocess模块,这样能更好地处理命令执行的错误和输出,避免因为命令失败导致的静默问题:import subprocess from shlex import quote # 替换原有的system调用 try: # 确保密码不会被保存 subprocess.run(['nmcli', 'c', 'modify', 'MyNetwork', '802-1x.password-flags', '2'], check=True) # 设置输入的用户名 subprocess.run(['nmcli', 'c', 'modify', 'MyNetwork', '802-1x.identity', quote(self.usernameCtrl.GetValue())], check=True) # 发起连接 subprocess.run(['nmcli', 'c', 'up', 'MyNetwork'], check=True) except subprocess.CalledProcessError as e: dlg = wx.MessageDialog(self, f"连接失败:{e}", "错误", wx.OK | wx.ICON_ERROR | wx.CENTRE) dlg.ShowModal() self.connectButton.Enable() return - 可以增加连接状态的反馈,比如判断
nmcli c up是否执行成功,给用户明确的提示 - 把连接名称(比如示例中的"MyNetwork")做成可配置项,比如在界面上加个输入框,或者存到配置文件里,这样换网络时不用修改代码
另外,还有一个进阶思路:你可以创建一个空白的“模板”连接配置,每次连接前复制这个模板生成临时连接,修改identity后启动临时连接,用完就删除它,这样不会改动原有的连接配置,更干净。
总结一下:目前NetworkManager官方没有完美的GUI选项实现“每次询问用户名”,要么尝试手动配置identity-flags,要么用自定义工具动态修改身份后再连接。你的POC工具已经是个很好的起点,稍微优化一下就能日常使用了。
备注:内容来源于stack exchange,提问作者Fubert

