[linux-l] xlock fuer alle Benutzer

Jens Dreger jens.dreger at physik.fu-berlin.de
Do Jul 12 12:29:00 CEST 2007


On Thu, Jul 12, 2007 at 11:34:32AM +0200, Ivan F. Villanueva B. wrote:
> Hallo,
> kann jemand mich auf die richtige Spur bringen?
> 
> Ich möchte bevor ein "suspend to disk" mindestens für den in vt7 (X)
> angemeldeten Benutzer "xlock" ausführen. Das soll in "/etc/acpi/sleepbtn.sh"
> stattfinden. Welche Befehle gibt es, um zu wissen, wer in vt7 angemeldet ist?
> Kann man einfach so etwas benutzen: su username xlock? Oder muss man davor
> XDISPLAY richtig setzen?

Ach, das ist ja mal ein nettes Problem...

Root kann so ohne Weiteres auch nicht einfach irgendein X-Programm auf
dem Display eines Users starten (ist Dir sicher schon aufgefallen):

 root at smart:~> DISPLAY=:0.0 xdpyinfo
 Xlib: connection to ":0.0" refused by server

Das liegt daran, dass der XServer gerne eine Authentisierung sehen
will. Das geht mit xauth. Bei gdm liegt die entsprechende Datei unter
/var/lib/gdm/:0.Xauth, zu erkennen z.B. mit ps aux:

 /usr/X11R6/bin/X :0 -ignoreABI -br -audit 0 -auth /var/lib/gdm/:0.Xauth -nolisten tcp vt7

Damit kommt root ans Display ran:

 root at smart:~> XAUTHORITY=/var/lib/gdm/:0.Xauth DISPLAY=:0.0 xdpyinfo| head
 name of display:    :0.0
 version number:    11.0
 vendor string:    The X.Org Foundation
 [...]

Das naechste Problem ist jetzt, dass Du xlock ja nicht als root
starten willst, denn dann muss man ja das root-Passwort eingeben um
wieder ranzukommen.

Was ich mal eben gestestet habe und was auch geht, ist, die
.Xauth-Datei lesbar nur fuer den eingeloggten User irgendwo abzulegen
und dann xlock ueber su zu starten. Der User hat sowieso eine eigene
Xauth Datei, aber deren Pfad rauszufinden ist auch irgendwie
umstaendlich. Wenn Du die PID der Session kennst, geht's:

 root at smart:~> tr '\0' '\n' < /proc/31761/environ | grep XAUTHORITY
 XAUTHORITY=/tmp/.gdmWP70UT

Umkopieren ist aber immer machbar. Das script hier funktioniert bei
mir:

 #!/bin/bash
 # JMD(12.07.07): remote-xlock.sh
 XUSER=$(w | awk '$2 == ":0" { print $1 }')
 install -o $XUSER -m 400 /var/lib/gdm/:0.Xauth /tmp/remote-xlock.xauth
 XAUTHORITY=/tmp/remote-xlock.xauth DISPLAY=:0.0 su $XUSER xlock
 rm -f /tmp/remote-xlock.xauth

Den /var/lib/gdm/:0.Xauth Pfad musste evtl aus ps raussuchen oder
sonstwo, wenn Du nicht gdm benutzt...

Gruss,

Jens.

-- 
Jens Dreger                      Freie Universitaet Berlin
dreger at physik.fu-berlin.de       Fachbereich Physik - ZEDV
Tel: +49 30 83854774             Arnimallee 14
Fax: +49 30 83855902	         14195 Berlin



Mehr Informationen über die Mailingliste linux-l