我想在 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 ,但没那么简单。