Korzystając z wiersza poleceń, chcę wyświetlać powiadomienie na każdym uruchomionym ekranie X. (i uruchomiona konsola)
Coś jak:
notify-send-all 'Warning' 'Nuclear launch in 5 minutes, please evacuate'
Czy istnieje program, który to zrobi? Jeśli nie, czy można to zaimplementować za pomocą bash?
command-line
xorg
tty
console
notifications
Stefan
źródło
źródło
Odpowiedzi:
Możesz wysłać wiadomość do wszystkich konsol za pomocą ściany poleceń.
Do wysyłania powiadomień zgodnie z X-em wysyłane jest powiadomienie wysyłające powiadomienie do bieżącego użytkownika na bieżącym ekranie. (Wydaje mi się, że z tego pytania już to znasz.) Możesz na tym oprzeć się za pomocą skryptów bash. Zasadniczo musisz dowiedzieć się, którzy użytkownicy korzystają z X-Displays. Po otrzymaniu tych informacji możesz użyć powiadomienia-wysyłania w następujący sposób:
Gdzie fschmitt jest użytkownikiem na wyświetlaczu 0. Możesz przeanalizować dane wyjściowe polecenia „who”, aby znaleźć wszystkich użytkowników i ich ekrany. Dane wyjściowe wyglądają tak
Widzisz, jest dwóch użytkowników uruchamiających sesje X, markmerk3 na wyświetlaczu 0 i seamonkey na wyświetlaczu 1. Myślę, że musisz grep dla tty [0-9] *, a następnie upewnij się, że na końcu wiersza jest (: [0 -9.] *), Aby pozbyć się logowania do konsoli i wyodrębnić identyfikator wyświetlania z ciągu między nawiasami.
źródło
who
informuje, kto jest zalogowany i na którym X wyświetla się to logowanie. Być może będziesz musiał go nieco odfiltrować.who | awk '/\(:[0-9]+\)/ {gsub("[:|(|)]","");print "DISPLAY=:"$5 " sudo -u " $1 " notify-send \"Message\""}' | bash
. Ponadto możesz zobaczyć unix.stackexchange.com/questions/1596/…Ten wątek jest nieco stary, przepraszam, ale mam nadzieję, że nadal mogę dodać coś użytecznego do tematu. (także Josef Kufner napisał fajny skrypt, na mój gust był trochę za długi i używa PHP)
Potrzebowałem także narzędzia opisanego w pierwotnym pytaniu (aby wysłać wiadomość do wszystkich aktywnych użytkowników X). I na podstawie odpowiedzi tutaj napisałem ten mały skrypt typu bash, który wyszukuje aktywnych użytkowników X (używając „kto”), a następnie uruchamia powiadomienie-wysyłanie dla każdego aktywnego użytkownika.
A najlepsze: możesz użyć mojego skryptu dokładnie tak jak „powiadom-wyślij” ze wszystkimi jego parametrami! ;-)
powiadom-wyślij-wszystko:
Skopiuj powyższy kod do pliku o nazwie „powiadom-wyślij-wszystko”, spraw, aby był wykonywalny i skopiuj go do / usr / local / bin lub / usr / bin (jak chcesz). Następnie uruchom go np. Jako root w sesji konsoli jak poniżej:
notify-send-all -t 10000 "Warning" "The hovercraft is full of eels!"
Używam go już od kilku miesięcy na różnych maszynach i jak dotąd nie miałem żadnych problemów, i przetestowałem go na komputerach stacjonarnych MATE i Cinnamon. Z powodzeniem działa również w cron i anacron.
Napisałem ten skrypt dla / pod ArchLinux, więc proszę powiedz mi, jeśli masz problemy z innymi dystrybucjami Linuksa lub komputerami stacjonarnymi.
źródło
|egrep
?? czy egrep jest poleceniem?awk '{print $1$5}'
tego lepiej jest używaćawk '{print $1$NF}'
, aby nie pękało w niektórych lokalizacjach, w których data jest formatowana spacjami (np.Jun 3
Zamiast2017-06-03
). Oto również wersja powiadamiająca określonego użytkownika zamiast wszystkich użytkowników: gist.github.com/shvchk/ba2f0da49bf2f571d6bf606d96f289d7grep -E
i dodaniu/bin
do ścieżki (patrz edycja). Możesz się wycofać, jeśli sprzeciwisz sięPotrzebowałem tego również w przypadku niektórych powiadomień systemowych. Oto moje rozwiązanie. Skanuje / proc, aby znaleźć wszystkie magistrale sesji, a następnie wykonuje powiadomienie-wysyłanie na każdym z nich (raz na magistralę). Wszystkie argumenty są przekazywane niezmienione do rzeczywistego powiadomienia-wysłania.
źródło
W Ubuntu 16.04 chciałem otrzymywać powiadomienia ze skryptu działającego jako root z crontab. Po ustawieniu zmiennych środowiskowych
sudo -u $user
nie działał z jakiegoś powodu, alesh -c "..." $user
działa.Używam teraz tej funkcji:
Jak znaleźć zmienną DBUS_SESSION_BUS_ADDRESS, prawdopodobnie zależy od twojej dystrybucji. W Ubuntu 16.04 jest on dostępny
/run/user/$UID/dbus-session
i można go po prostu zdobyć.id -u
jest używany w funkcji powyżej, aby uzyskać identyfikator UID z nazwy użytkownika zwróconej przezwho
.źródło
Oto aktualizacja skryptu Andy'ego: Sposób, w jaki to określił
DBUS_SESSION_BUS_ADDRESS
, nie działa na Centos 7. Równieżwho
polecenie z jakiegoś powodu nie wyświetlało niektórych sesji, więc analizuję daneps aux
wyjściowe. Ten skrypt zakłada, że użytkownicy są zalogowani za pomocą X2GO (nxagent
), ale powinno być łatwe do dostosowania w innych przypadkach.źródło
źródło