![检测当前连接是否在没有 NetworkManager 的情况下进行计量](https://linux22.com/image/187202/%E6%A3%80%E6%B5%8B%E5%BD%93%E5%89%8D%E8%BF%9E%E6%8E%A5%E6%98%AF%E5%90%A6%E5%9C%A8%E6%B2%A1%E6%9C%89%20NetworkManager%20%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E8%BF%9B%E8%A1%8C%E8%AE%A1%E9%87%8F.png)
我与其他开发人员一起创建了一个脚本,只要 Linux 系统未连接到按流量计费的连接,就会自动更新它们。
但我们发现有些系统会使用“systemd-networkd”而不是network-manager来配置网络,并且同时使用这两个程序会相互冲突。
所以我们不能真正依赖于系统上安装的 nmcli 并使用此解决方案问题。
答案1
没有单一可靠的方法可以自动检测到这一点。网络有一些方法可以暗示它是按流量计费的,但这些方法远没有得到普遍部署。
充当 WiFi 热点或网络共享设备的 Android 设备会将 DHCP 选项 43 设置为 string
ANDROID_METERED
,并强制在 DHCP 响应中返回该选项。看:https://www.lorier.net/docs/android-metered.html苹果显然有自己的方式向使用 iOS 设备热点功能的客户端显示连接状态,尽管信息似乎很少。
WiFi 基站可以实现 Microsoft 设计的802.11协议扩展指示无线网络的计量状态。在 Linux 中,我认为
wpa_supplicant
可能是接收此信息的组件。如果不存在其他信息,Windows 将仅根据连接类型(以太网、WiFi、4G、3G 或默认/未知)设置“按流量计费的连接”属性的默认值:请参阅https://www.msoutlook.info/question/metered-network-warning
但是,当这些提示不存在时,您不能假设连接未按流量计费;可能是也可能不是。使用 NetworkManager,用户可以在配置连接时设置“计量连接”属性,因为用户可能最了解连接的状态。
因此,您可能只是让用户选择/负责运行您的脚本或禁用它。
答案2
正如 @telcoM 所说,没有确定的方法可以确定连接是否按流量计费。另一个选项是建立一个已知连接表以及是否对它们进行计量。一个相对较好的指标是外部 IP 地址,您可以使用以下命令确定该地址
dig +short myip.opendns.com @resolver1.opendns.com
答案3
我们发现的唯一解决方案仍然需要网络管理器:
nmcli --terse --fields GENERAL.METERED dev show 2>/dev/null | grep --quiet "yes"