检测是否使用NetworkManager计量当前连接

phi*_*hag 6 linux shell networkmanager

如何使用NetworkManager在系统上检测当前连接是否标记为已计量?

这是来自Shell脚本的,但是我可以通过Python轻松地调用任何C函数。

los*_*der 8

使用 nmcli 实用程序,必要的步骤是:

  1. 验证 NetworkManager 是1.0.6+ 版本

    $ nmcli -v nmcli tool, version 1.9.0

  2. 检查接口上的 GENERAL.METERED:

    $ nmcli -t -f GENERAL.METERED dev show eth1 GENERAL.METERED:unknown

  3. 值是: unknown, yes, no, yes (guessed), no (guessed)

  4. 强制值是这样完成的:

    $ nmcli dev modify wlan1 connection.METERED yes Connection successfully reapplied to device 'wlan1' $ nmcli -t -f GENERAL.METERED dev show wlan1 GENERAL.METERED:yes

并且,要获取按设备分组的列表:

  $ nmcli -t -f GENERAL.DEVICE,GENERAL.METERED dev show

  GENERAL.DEVICE:wlan1
  GENERAL.METERED:yes

  GENERAL.DEVICE:eth1
  GENERAL.METERED:unknown

  GENERAL.DEVICE:lo
  GENERAL.METERED:unknown
Run Code Online (Sandbox Code Playgroud)

尝试将其缩减为仅关于默认路由的信息仍需要调用另一个命令,因为 NetworkManager 不会尝试区分处于连接状态的多个设备:

  $ nmcli -t -f GENERAL.DEVICE,GENERAL.METERED dev show `ip route list 0/0 | sed -r 's/.*dev (\S*).*/\1/g'`
Run Code Online (Sandbox Code Playgroud)


Jos*_*osh 5

您还可以通过 D-Bus 获取当前连接的计量状态。在 shell 中,您可以使用busctl

busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Metered
Run Code Online (Sandbox Code Playgroud)

nmcli解决方案相比,这只是一个命令,在其他编程语言中,直接使用 D-Bus 而不是必须调用nmcli.

  • 结果是具有以下[值]的枚举(https://developer.gnome.org/NetworkManager/stable/nm-dbus-types.html#NMMeered) (4认同)