如何监控 NetworkManager 连接?

如何监控 NetworkManager 连接?

我想在 NetworkManager 连接到某个 WiFi 时启动某个应用程序。但是从 DBus 中,除了 libNotify 的通知外,我找不到来自 NetworkManager 的此类信号。有没有更直接的方法?

答案1

NetworkManager 包含一个nmcli程序,该程序有一个monitor命令。当我断开连接然后连接到 Wi-Fi 接入点时,它的输出如下所示:

$ nmcli monitor
There's no primary connection
wlp4s0: unavailable
Networkmanager is now in the 'disconnected' state
wlp4s0: disconnected
wlp4s0: using connection 'CyberShadowPC'
wlp4s0: connecting (prepare)
Networkmanager is now in the 'connecting' state
wlp4s0: connecting (configuring)
wlp4s0: connecting (need authentication)
wlp4s0: connecting (prepare)
wlp4s0: connecting (configuring)
wlp4s0: connecting (getting IP configuration)
wlp4s0: connecting (checking IP connectivity)
wlp4s0: connecting (starting secondary connections)
wlp4s0: connected
Networkmanager is now in the 'connected' state
'CyberShadowPC' is now the primary connection

看起来应该很容易解析其输出并根据需要运行适当的操作。这是一个 bash 脚本,当 NetworkManager 连接成为活动主连接时,它会运行一个命令:

#!/bin/bash
set -euo pipefail

connection_name=CyberShadowPC
command=(notify-send "Connected to $connection_name!")

LC_ALL=C nmcli monitor | \
    while read -r line
    do
        if [[ "$line" == "'$connection_name' is now the primary connection" ]]
        then
            "${command[@]}"
        fi
    done

答案2

跑步

dbus-monitor --system“类型='信号',接口='org.freedesktop.NetworkManager'”

然后更改您的 wifi 连接。您将收到属性已更改的信号。它返回已激活的“PrimaryConnection”。

然后,您可以查询已激活的连接并查看它是否与您感兴趣的连接匹配。

例如:

qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/ActiveConnection/Whatever org.freedesktop.DBus.Properties.GetAll org.freedesktop.NetworkManager.Connection.Active

qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/AccessPoint/Whatever org.freedesktop.DBus.Properties.Get org.freedesktop.NetworkManager.AccessPoint.Ssid

(检测到属性变化后运行 iwgetid -r 可能更简单)

答案3

虽然当然可以使用dbus,但我个人建议使用简单的 bash while 循环 + awk

while [ "$(iwconfig 2> /dev/null |  awk '/Access Point/ && /XX:YY:ZZ:11:22:33/ {print "true" }')" != "true" ]; do : ; sleep 0.25 ;done ; echo DONE

那里发生了什么?当循环继续运行时,测试输出iwconfig被过滤掉awk。只要awk没有找到您要连接的接入点的 mac 地址,循环就会继续运行。一旦awk看到您已与该特定 AP 关联,测试条件[ "String1" != "String2" ]就会变为假,循环就会中断,并继续执行echo DONE命令。当然,echo DONE可以用您想要运行的程序替换。

该命令可以手动运行或放入脚本中,并将脚本添加到启动应用程序列表中。

简单、直接,而且能完成工作。就像我在开头说的,可以使用 dbus ,但没那么简单。

相关内容