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.