Der Wert der Umgebungsvariable “XAUTHORITY” ist nicht das Cookie, sondern
der Pfad der Datei, in der es gespeichert ist. Deshalb funktioniert bei mir
als “root”, ohne gesetzte Umgebungsvariable DISPLAY:
DISPLAY=$(who | awk '/^joe[[:space:]]+:[[:digit:]]/ {print $2}') \
XAUTHORITY=$(ps a | awk '/\/[X]/ { match($0, /[[:space:]]-
auth[[:space:]]+([^[:space:]]+)/, a); print a[1] }') \
xmessage -center foo &
Erklärung:
who(1) liefert die Liste der angemeldeten Benutzer. In der ersten Spalte
steht der Benutzername; nach diesem wird gefiltert. In der zweiten Spalte
(“$2”) steht die “terminal line”; die vom X11-Server beginnt offenbar mit
“:” und ist identisch mit dem vom Benutzer verwendeten X11-Display. Deshalb
wird nach solchen Zeilen gefiltert (alternativ funktional identisch: “$1 ~
/^joe$/ && $2 ~ /^:[[:digit:]]/”). Entsprechend wird für den auszuführenden
Befehl die Umgebungsvariable “DISPLAY” gesetzt.
ps(1) liefert die Prozessliste; diese wird nach Einträgen, die “/X”
enthalten, gefiltert, um den Befehl für den X11-Server-Start herauszufinden.
Damit der Aufruf von awk(1), der auch diese Zeichenfolge enthält, nicht
gefunden wird, wird “/X” mit “/[X]” gesucht (ansonsten äquivalent:
Zeichenklasse bestehend aus einem Zeichen). Der Pfad der Datei, in der
offenbar *alle* gültigen MIT-MAGIC-COOKIE-1’s abgelegt werden, wird bei mir
im X11-Aufruf mit dem Parameter “-auth” angegeben; diese Option wird gesucht
und dessen Wert an die Umgebungsvariable “XAUTHORITY” für den auszuführenden
Befehl zugewiesen. (Man kann auch ~joe/.Xauthority angeben, aber das
funktioniert nur, wenn joe nicht XAUTHORITY auf einen anderen Wert gesetzt
hat.)
Der auszuführende Befehl ist “xmessage foo”; er wird es im Hintergrund
ausgeführt (“&”), da andernfalls die weitere Ausführung unterbrochen wird,
bis der Zielbenutzer (joe) die Meldung wegklickt. Die Option “-center”
zeigt die Meldung in der Mitte des Bildschirms an.
Dieser Ansatz funktioniert bei mir (mit und ohne “&”) auch mit notify-
send(1). [Aber nicht aus screen(1) heraus, weder mit
TERM=screen-256color+italic (benutzerdefinierte Terminal-Definition für
Kursivschrift in screen-Terminals) noch TERM=xterm oder dem screen-Default
TERM=screen. Woran liegt das?]
Mit der benutzerdefinierten Shell-Funktion
notify () {
(
user=$1
shift
DISPLAY=$(who | awk -v user=$user '
BEGIN { rx = "^" user "[[:space:]]+:[[:digit:]]" }
$0 ~ rx { print $2 }'
) \
XAUTHORITY=$(
ps a |
awk '/\/[X]/ { match($0, /[[:space:]]-
auth[[:space:]]+([^[:space:]]+)/, p); printf "%s", p[1] }'
) \
notify-send "$@"
);
}
geht dann
notify michael 'Hinweis' 'Du hast den Farbfilm vergessen!'
MIT-MAGIC-COOKIE-1 ist gemäss Xsecurity(7) aber nur eine von 5
Möglichkeiten, einen X11-Server gegen unbefugten Zugriff abzusichern, wenn
auch offenbar unter GNU/Linux der Default.