das hier ist die Fortsetzung meines Threads über die Benachrichtigung bei neu angeschlossenen Eingabegeräten ("heimliche USB-Eingabegeräte").
Es geht aber auch noch um etwas neues: Unter Gnome, Mate, XFCe und uU anderen Desktopumgebungen kann man nicht immer auf Anhieb erkennen, ob ein in der grafischen Oberfläche gemounteter USB-Stick oä bereits vollständig ausgehängt ist oder nicht.
In nautilus und möglicherweise auch anderen Dateimanagern verschwindet der Datenträger nämlich sofort nachdem man auf "Auswerfen"/⏏ geklickt hat. Die Schreibvorgänge gehen danach oft noch eine Zeit weiter und wenn man die Aktivitäts-LED des Datenträgers nicht sieht oder es gar keine gibt, kann man eigentlich gar nicht wissen wann man den Datenträger abziehen darf ohne verlorene Daten oder zumindest ein beschädigtes Dateisystem befürchten zu müssen.
Bei wichtigen Dingen habe ich immer in einem Terminalfenster den Befehl
Code: Alles auswählen
$ sync
Also habe ich mir mit
Code: Alles auswählen
$ udevadm monitor
Das Ergebnis poste ich erstens natürlich, weil ich hoffe, dass es jemand nützlich findet, ich würde mich aber auch sehr freuen, wenn es ein paar ausprobieren würden. Gerade beim Schreiben der Regeln bin sehr unsicher, welche Attribute und Variablen man sinnvollerweise zum Eingrenzen der Events verwendet, damit nicht bei jedem Unmounten oder Anstecken eines Geräts gleich dutzende Benachrichtigungen erscheinen…
Voraussetzung ist, dass das Paket libnotify-bin installiert ist und man zwei Dateien anlegt:
/etc/udev/rules.d/71-local.rules
Code: Alles auswählen
ACTION=="add", ENV{DEVNAME}=="/dev/input/event*", SUBSYSTEM=="input", RUN+="/usr/local/bin/udev-notification add_input"
ACTION=="add", SUBSYSTEM=="net", RUN+="/usr/local/bin/udev-notification add_net"
ACTION=="remove", ENV{ID_FS_USAGE}=="filesystem", SUBSYSTEM=="block", RUN+="/usr/local/bin/udev-notification remove_block"
Code: Alles auswählen
#!/bin/sh
case "${1}" in
remove_block)
HEADER="Block device removed"
MESSAGE="${ID_VENDOR} ${ID_MODEL} with ${ID_FS_LABEL} (${ID_FS_TYPE}) on ${DEVNAME}."
ICON="media-removable-symbolic"
PRIORITY="low"
;;
add_input)
HEADER="Warning: New input device"
MESSAGE="${ID_VENDOR} ${ID_MODEL} (${DEVNAME}) via ${ID_BUS} (interface ${ID_USB_INTERFACE_NUM})"
ICON="input-keyboard-symbolic"
PRIORITY="critical"
;;
add_net)
HEADER="Warning: New network interface"
MESSAGE="${ID_VENDOR} ${ID_MODEL} (driver: ${ID_NET_DRIVER}) as ${INTERFACE} via ${ID_BUS} (interface ${ID_USB_INTERFACE_NUM})"
ICON="network-wired-symbolic"
PRIORITY="critical"
;;
*)
exit 0
esac
for SESSIONID in $(loginctl --no-legend list-sessions | awk '{print $1}')
do
SESSION=$(loginctl show-session ${SESSIONID})
USERNAME=$(echo "${SESSION}" | sed -ne 's/^Name=//p')
DISPLAY=$(echo "${SESSION}" | sed -ne 's/^Display=//p')
TYPE=$(echo "${SESSION}" | sed -ne 's/^Type=//p')
REMOTE=$(echo "${SESSION}" | sed -ne 's/^Remote=//p')
ACTIVE=$(echo "${SESSION}" | sed -ne 's/^Active=//p')
if [ ${TYPE} = "x11" ] && [ ${REMOTE} = "no" ]
then
export XAUTHORITY="$(getent passwd ${USERNAME} | cut -d: -f6)/.Xauthority"
export DISPLAY
su ${USERNAME} -c "notify-send -u ${PRIORITY} -i ${ICON} \"${HEADER}\" \"${MESSAGE}\""
fi
done
Code: Alles auswählen
# udevadm control --reload-rules
Das mit den Warnungen bei neuen Eingabegeräten und Netzwerkinterfaces kommt daher, dass das die beiden Arten von Geräten sind, die (mir) im Zusammenhang mit BadUSB am relevantesten erscheinen:
http://www.heise.de/security/meldung/Vi ... 54715.html
Noch schöner wäre es irgendwie, wenn man das notification-System auf diese Art dazu verwenden könnte erst nachzufragen, ob man das Aktivieren des jeweiligen Geräts zulassen will. Interaktive Nachfragen sind ja grundsätzlich möglich, aber bei Eingabegeräten ist das uU auch eine etwas ungünstige Idee, wenn sich etwa die einzige Maus oder Tastatur aus irgendeinem Grund neu am System anmelden will und man überhaupt kein Eingabegerät mehr zu Verfügung hat um die Nachfrage zu bestätigen, ganz abgesehen davon, dass ich weniger als keine Ahnung habe, wie man das machen so eine Nachfrage realisieren könnte.