【发布时间】:2017-08-30 22:29:30
【问题描述】:
如何检测当前连接是否在具有 NetworkManager 的系统上标记为按流量计费?
这是来自 shell 脚本,但我可以通过 Python 轻松调用任何 C 函数。
【问题讨论】:
标签: linux shell networkmanager
如何检测当前连接是否在具有 NetworkManager 的系统上标记为按流量计费?
这是来自 shell 脚本,但我可以通过 Python 轻松调用任何 C 函数。
【问题讨论】:
标签: linux shell networkmanager
您还可以通过 D-Bus 获取当前连接的计量状态。在 shell 中,您可以使用 busctl:
busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Metered
这只是一个命令,与 nmcli 解决方案相比,在其他编程语言中,直接使用 D-Bus 而不必调用 nmcli 会更有效。
【讨论】:
使用 nmcli 实用程序,必要的步骤是:
验证 NetworkManager 是 version 1.0.6+:
$ nmcli -v
nmcli tool, version 1.9.0
在接口上检查 GENERAL.METERED:
$ nmcli -t -f GENERAL.METERED dev show eth1
GENERAL.METERED:unknown
强制值是这样完成的:
$ 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
尝试将其缩减为仅关于默认路由的信息仍需要a call to another command,因为 NetworkManager 不会尝试区分处于连接状态的多个设备:
$ nmcli -t -f GENERAL.DEVICE,GENERAL.METERED dev show `ip route list 0/0 | sed -r 's/.*dev (\S*).*/\1/g'`
【讨论】:
nmcli -t -f GENERAL.METERED dev show(没有设备)的输出对我来说是所有可能值的混合。
ip route 最好是ip monitor 以可靠地跟踪默认路由或相关服务器的接口,然后执行/redo nmcli 查询。
[[ "$(nmcli -t -f GENERAL.METERED dev show `ip route list 0/0 | sed -r 's/.*dev (\S*).*/\1/g'` | cut -d':' -f2)" == yes* ]]测试输出