Я хочу запустить определенное приложение, когда NetworkManager соединяется с определенным WiFi. Но от DBus, я не мог найти такой сигнал от NetworkManager кроме уведомления о libNotify. Существует ли более прямой путь?
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
похоже, что должно быть легко проанализировать свой вывод и выполнить надлежащие меры по мере необходимости. Вот сценарий удара, который выполняет команду, когда соединение 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
В то время как, конечно, возможно использовать dbus
, лично я пошел бы с простым циклом с условием продолжения удара + 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, но не так просто.
Запустите
dbus-monitor --system "type='signal',interface='org.freedesktop.NetworkManager'
Затем измените соединение Wi-Fi. Вы получите сигнал это свойство изменилось. Он возвращает «PrimaryConnection», который активирован.
Затем вы можете запросить активированное соединение и посмотреть, соответствует ли оно интересующему вас соединению.
Например:
qdbus --system -- литерал org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/ActiveConnection/Что угодно org.freedesktop.DBus.Properties.GetAll org.freedesktop.NetworkManager.Connection.Active
qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/AccessPoint/Что угодно org.freedesktop.DBus.Properties.Get org.freedesktop.NetworkManager.AccessPoint.Ssid
(вероятно, проще запустить iwgetid -r после обнаружения изменения свойства)