Posso avviare un programma grafico sul desktop di un altro utente come root?


39

Di seguito sono riportate altre domande che penso di dover conoscere:

  • Da una sessione non X? (significa che root non è registrato in X)

  • Se su X sono state eseguite più persone, è possibile rilevare automaticamente chi si trovava su quale schermo e quindi rilevare a livello di programmazione su quale schermo è necessario avviare l'app?

  • Posso avviare l'app come utente? (ok sono sicuro al 99,999% che si tratta di un sì)

  • Posso rilevare se gli utenti del gruppo X hanno effettuato l'accesso a X?


Fai attenzione che lo naga_plugged.plscript finisca (o si biforca in background), perché udevaspetterà che finisca .
rozcietrzewiacz,

grazie l'ho reso un demone chiamando daemon (0,0) nel codice c che naga_plugged.pl chiama per ultimo. Non ho mai visto nuovi forum unix qui. Dovrebbero rendere tutto un sito anziché i nuovi domini.
over_optimistic

Risposte:


23

Per avviare un programma grafico sul desktop di un utente, devi trovare due cose: quale display è il desktop dell'utente (l'indirizzo) e quale cookie di autorizzazione usare (la password).

Il comando seguente dovrebbe elencare i display locali a cui l'utente ha effettuato l'accesso (uno per riga) sulla maggior parte degli unices:

who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'

Trovare il cookie di autorizzazione è un po 'più difficile. Devi cercare il file cookie dell'utente, che è ~/.Xauthorityper impostazione predefinita (tutto ciò che serve è la posizione del file cookie, non è necessario estrarre il cookie da esso). Funziona su molti sistemi, ma non tutti; dipende dal display manager e da come è impostato, e in particolare Gdm (il default su Ubuntu) non ha usato la posizione predefinita per l'ultima volta. Non riesco a pensare a un modo portatile per scoprire il file X cookie attuale. Il modo più accurato per scoprirlo è scoprire il pid del processo X e cercare l'argomento per l' -authopzione. Un altro modo è trovare un processo in esecuzione su quel server X e catturare la sua XAUTHORITYvariabile di ambiente. Se hai problemi a trovare il file cookie, vediAprire una finestra su un display X remoto (perché "Impossibile aprire il display")?

Una volta che hai entrambe le informazioni, inserisci la visualizzazione scelta nella DISPLAYvariabile d'ambiente, il file del cookie dell'autorità X scelto nella XAUTHORITYvariabile d'ambiente e sei pronto. Non importa quale utente esegue il programma; combinalo con suse ti piace.


In che modo "cerca l'argomento per l'opzione -auth"?
rubo77,

@ rubo77 Con pso htopo ...
Gilles 'SO- smetti di essere malvagio'

OK, quindi pids=$(pgrep -u $target_user nautilus)ottiene il pid, e dove devo mettere -authun'opzione?
rubo77,

1
@ rubo77 Non metti -authun'opzione da nessuna parte. Potrebbe essere necessario cercarlo nella riga di comando del processo X server per capire cosa inserire nella XAUTHORITYvariabile di ambiente. Se hai il processo di un client, ciò di cui hai bisogno non è altro -authche il valore della XAUTHORITYvariabile di quel client . Non capisco cosa stai cercando di fare. Potresti voler fare una nuova domanda.
Gilles 'SO- smetti di essere malvagio' il

Cerco di utilizzare le tue informazioni qui per risolvere come creare una notifica sullo schermo avviata da root
rubo77

11

Non posso provarlo completamente poiché tutte le mie macchine hanno il root disabilitato.

Per trovare su quale display è attivo un utente, puoi usare il whocomando. L'ultima colonna di output è di solito il DISPLAY a cui l'utente ha effettuato l'accesso. Qualcosa del genere potrebbe essere usato per afferrare solo il display (c'è probabilmente un modo molto più efficiente per farlo, sentiti libero di offrire modifiche):

who | grep -m1 ^username.*\( | awk '{print $5}' | sed 's/[(|)]//g'

Quindi per avviare un comando X grafico su quel display:

DISPLAY=:0 firefox &

dove: 0 verrebbe sostituito con qualunque display tu abbia trovato nel primo comando e firefox verrebbe sostituito con qualunque comando tu voglia eseguire. Puoi metterlo in uno script di shell e usare solo una variabile.

La parte successiva è la parte che non ho testato, ma non vedo perché non dovrebbe essere possibile farlo:

su username -c "DISPLAY=:0 firefox"

per lanciare il comando X come quell'utente.


1
Solo perché root è disabilitato non significa che le cose non vengano eseguite come root;) In realtà ho bisogno di eseguirlo come uno script che funziona come root.
xenoterracide,

@xenoterracide, giusto. Intendevo solo che non potevo provarlo in tutte le circostanze possibili. Cioè, l'ho provato solo come root usando sudo -ie non potevo essere sicuro che i risultati sarebbero stati diversi dal eseguirlo dopo aver effettuato l'accesso come root direttamente. :-)
Steven D

Ho dovuto modificare un po 'chi. Questo who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ sembra funzionare ...
xenoterracide,

perché qualcuno usa grep e sed quando c'è già awk nella catena è oltre me.

sì ... "impara awk" è nella mia lista delle cose da fare ormai da un po '.
Steven D,

4

Potresti vedere come lo fa acpid. Ad esempio quando emette comandi xscreensaver o cancella lo schermo per ogni utente che esegue X o X-session.

Ad esempio, in Ubuntu questo file contiene elementi correlati:

/etc/acpi/lid.sh

Contiene questo ciclo:

for x in /tmp/.X11-unix/*; do
    displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
    getXuser;
    if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
        grep -q off-line /proc/acpi/ac_adapter/*/state
        if [ $? = 1 ]
            then
            if pidof xscreensaver > /dev/null; then 
                su $user -c "xscreensaver-command -unthrottle"
            fi
        fi
        if [ x$RADEON_LIGHT = xtrue ]; then
            [ -x /usr/sbin/radeontool ] && radeontool light on
        fi
        if [ `pidof xscreensaver` ]; then
            su $user -c "xscreensaver-command -deactivate"
        fi
        su $user -c "xset dpms force on"
    fi
done

In particolare, il codice è in /usr/share/acpi-support/power-funcs. Chiama fgconsoleper trovare il vt Linux attivo, quindi cerca un server X visualizzato su questa console e trova l'utente da lì. Quindi utilizza ~/.Xauthoritycome cookie X, che a meno che non manchi qualcosa, significa che non sarà in grado di connettersi al server X (la configurazione predefinita di Ubuntu, usando gdm, non memorizza i cookie X nella casa dell'utente directory).
Gilles 'SO- smetti di essere malvagio' il

@Gilles lid.sh ad esempio non chiama getXconsole. Pertanto, fgconsole non viene utilizzato. Ho aggiornato la risposta con lo snippet che avevo in mente. E in realtà funziona su Ubuntu. Lo schermo si oscura quando chiudo il coperchio.
maxschlepzig,

1
In Ubuntu 14.04 ottengo l'erroregetXuser: command not found
rubo77

1

Un'estensione alla risposta di Gilles è come trovare il file cookie. Un modo per farlo potrebbe essere dopo aver impostato la DISPLAYvariabile d'ambiente (come descritto da Gilles), usare straceper trovare l' xhostaccesso ai file . Mi viene in mente qualcosa del genere in BASH:

# Set the DISPLAY variable first
DISPLAY = :0.0
# Use strace on xhost
strace xhost 2>&1 | grep access

L'output del codice sopra sarà simile a:

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/home/someuser/.Xauthority", R_OK) = 0

Come puoi vedere chiaramente, il file cookie apparirà direttamente qui.


0

Nella mia ricerca per trovare un modo elegante per visualizzare attività GUI o X da un ambiente limitato come le regole udev o dal superutente, ho recentemente creato uno strumento per adattarlo ( per maggiori dettagli ).

xpub è uno script di shell per ottenere le variabili dell'ambiente di visualizzazione X relative al TTY corrente o a un dato.

Questo è un esempio con una regola udev:

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV}: se l'utente-tty corrente avvia X, altrimenti rimuoverlo.

Il principio è lo stesso per una riga di comando che utilizza export:

export $(xpub) ; su ${XUSER} -c 'notify-send Hello'

1
Ti suggerisco di chiarire che sei l'autore di questo script xpub.
Dmitry Grigoryev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.