Esecuzione dell'applicazione GUI come altro utente (non root)


34

Diciamo che ho 2 account utente user1e user2. Quando eseguo il login come user1, e poi user2utilizzo su, posso eseguire i programmi della riga di comando, ma i programmi della GUI falliscono.

Esempio:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 

Quindi, come posso eseguire un'applicazione GUI?


Uno dei motivi principali, ho scoperto, che questo non riesce è perché $XAUTHORITYè ancora impostato su user1 ~/.Xauthority, che il programma, immagino, proverà a leggere, e fallisce perché quel file ha in genere la modalità 0600 ( -rw-------), il che significa che non è disponibile per la lettura da parte di chiunque nel gruppo "altro", che include user2. Significa che se chmod o+r ~/.Xauthority(come utente1), avrai violato questo problema. Ho scritto una sceneggiatura che lo dimostra.
Braden Best

Risposte:


42

su vs. su -

Quando si diventa un altro utente, generalmente si desidera utilizzare su - user2. Il trattino forzerà l'utente2.bash_profile ottenere.

xhost

Inoltre dovrai concedere agli utenti l'accesso al tuo display. Questo è governato da X. Puoi usare il comandoxhost + per consentire ad altri utenti l'autorizzazione a visualizzare la GUI sul desktop dell'utente1.

NOTA: durante l'esecuzionexhost + ti consigliamo di eseguirlo mentre sei ancora in una shell che appartiene all'utente1.

$ DISPLAY

Quando si diventa user2, potrebbe essere necessario impostare la variabile di ambiente $DISPLAY.

$ export DISPLAY=:0.0

1
xhost +user2mi dà ancora questo errore - xhost: bad hostname "user2". Ne ho cercato su google e sembra che debba fare xhost +user2@laptopo xhost +user2@localhost, non sono sicuro di quale. Quindi dice xhost +user2@localhost being added to access control list.
sashoalm,

1
Ma anche dopo aver aggiunto l'utente con xhoste aver specificato export DISPLAY=:0.0, l'esecuzione leafpadmi dà ancora No protocol specified leafpad: Cannot open display:e non riesce a funzionare. Ho trovato questo link su linuxquestions.org/questions/linux-newbie-8/… , che dice che ci sono alcuni biscotti magici e xauth. Hai provato che quelle cose funzionano sul tuo computer tra l'altro? Forse qualcosa è diverso con la mia configurazione? Sono su Debian + LXDE.
sashoalm,

1
Grazie, xhost +funziona e nient'altro sembra essere necessario (non è necessario impostare $DISPLAY). Puoi aggiornare la tua risposta e la accetterò?
sashoalm,

5
Oh, ho trovato qualcosa. Su Fedora 21 in esecuzione xhostdà un elenco nel formato SI:localuser:USERNAME, quindi xhost SI:localuser:user2dovrebbe funzionare. Oh e il display dell'utente può essere trovato usando w.
Wilf,

7
xhost +consentirà a qualsiasi utente su qualsiasi host in grado di connettersi al tuo x-server per accedere allo schermo. xhost +SI:localuser:user2lavora per me su Debian.
robartsd,

9

Devi condividere il token di autenticazione dall'utente1 (supponendo che ~sia la sede dell'utente1 ):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null

1
Questa è l'unica risposta che ha funzionato per me (Ubuntu 14).
sudo,

Questa soluzione funziona bene dall'interno della macchina remota (= client X Win) mentre le soluzioni xhost in altre risposte devono essere eseguite sulla macchina locale (= server X Win).
Jpsy

Potrebbe essere più sicuro da usare tee -aper evitare di ostruire qualsiasi informazione esistente in  .Xauthority.
Scott,

7

È possibile utilizzare l'inoltro X11:

ssh -XY otheruser@localhost your-gui-program-name-here

Questa è una soluzione geniale. Il più semplice che ho letto finora. Molte più persone hanno familiarità con ssh che con la configurazione x11.
Alexis Panagiotopoulos,

6

Puoi avviare l'app da un altro utente. Inizierò l'app gimp da user2, mentre eseguo l'accesso (GUI) con l'utente 1:

$ xhost +
$ sudo su user2

(inserisci il pass)

$ gimp

Godere :)


4
Questo è lo stesso della risposta accettata di quattro anni.
G-Man dice "Ripristina Monica" il

puoi dire un modo migliore e veloce?
Antoni Stavrev

Ho sempre usato questo metodo, ma non funziona più con Debian e Xfce. ( correzione : funziona, ma devo export DISPLAYprima, come dice la risposta accettata)
giusti

dopo aver terminato la sessione sarà bene disabilitarlo entro$ xhost -
Antoni Stavrev il

4

Puoi provare il comando sux:

sux user2

sux gestirà le cose $ DISPLAY per te. Potrebbe essere necessario installarlo con:

sudo apt-get install sux

sotto Debian / Ubuntu.


4
suxnon viene più spedito da Debian o Ubuntu. La migliore alternativa che ho trovato è l'aggiunta xhost SI:localuser:root(o qualunque altro utente) ~/.xprofileper permetterlo permanentemente o per usarlorunuser
stefanct

Fino a Debian Stretch compreso, c'era gksu/ gksudoalternativa che funzionava bene. Mentre è ancora in Sid, viene rimosso in Buster per problemi di sicurezza.
Matija Nalis,

0

In alternativa a sux, per eseguire in sicurezza il comando grafico ( firefox-esrnell'esempio di seguito) come $AUTHUSER( guestnell'esempio di seguito):

AUTHUSER=guest
AUTHSTRING=SI:localuser:${AUTHUSER}
xhost +${AUTHSTRING} > /dev/null
SUDO_ASKPASS=/usr/bin/ssh-askpass
export SUDO_ASKPASS
sudo -k --askpass -u ${AUTHUSER} /usr/bin/firefox-esr
xhost -${AUTHSTRING} > /dev/null
sudo -K

il codice fa:

  1. consente guestall'utente di accedere all'utente corrente $DISPLAYtramitexhost +SI:localuser:guest
  2. usa ssh-askpassper chiederti graficamente la password (ovviamente, potresti sudoers(5) NOPASSWD:evitarlo, se la tua politica di sicurezza ritiene che sia ok. Oppure potresti usare altri askpassprogrammi o specificarli nei file di configurazione (vedi i sudo(8)dettagli su --askpass)
  3. se la password è ok (e hai i permessi in sudoers(5)) esegue il comando /usr/bin/firefox-esrcome un altro utente (guest )
  4. dopo il completamento del programma, le autorizzazioni ad altri utenti ( guest) per accedere al tuo $DISPLAYvengono revocate tramitexhost -SI:localuser:guest
  5. infine, sudo -Krimuove la password memorizzata nella cache, quindi la prossima chiamata di ssh-askpassti chiederà nuovamente la password (invece di utilizzare la password memorizzata nella cache)

    mentre è un po 'più di lavoro di quello gksu(8)che ha sux(8)fatto, può essere copiato ed è molto più sicuro di:

    • xhost + (qualsiasi utente avrà accesso al tuo display grafico finché sarà attivo)
    • leggibile ~ / .xauth da altri utenti (accesso indefinito di tale utente al display)
    • cosa gksu/ suxcosa (copia temporanea di ~/.Xauthority, che ha permesso all'utente specificato di copiare il tuo MIT-MAGIC-COOKIE-1e continuare a usare il tuo display anche dopo che gksu / sux ha terminato (purché non hai spento la macchina o non ti sei disconnesso dal display - screensaver, ibernazione ecc. non hanno cambiato la magia cookie).

poiché consentirà a un solo utente locale di accedere al display e solo finché il comando $AUTHUSERverrà eseguito (al termine del comando, non sarà più possibile accedere al display in alcun modo).

Un'altra alternativa sicura è ssh -X(senza la -Yquale in realtà ti rende meno sicuro! Vedi ForwardX11Trustedin ssh_config(5)per dettagli), poiché è più facile da usare se non lo stai copiando, ma induce un sovraccarico aggiuntivo (ad es. È più lento) e alcuni programmi potrebbero non funzionare correttamente senza rischi -Y .


-1

Devi caricare l'interfaccia utente dell'installazione come utente2 .

Prova a seguire questo:

Accedi come root :

sudo su

Prova il server x:

xclock

Se riesci a vedere un orologio in esecuzione, va bene, ora prova a eseguire questo:

xhost

Il risultato dovrebbe essere così:

xhost SI:localuser:tri
# tri is my user name

Ora lascia che user2 acceda a xhost

xhost +SI:localuser:user2

ora prova ad accedere nuovamente a user2 e prova ad aprire uno qualsiasi dei programmi della GUI.


(1) Non c'è nulla in questa domanda che richiede l'esecuzione come root o dove l'esecuzione come root è utile. (1b) Se non altro, l'esecuzione come root può confondere le cose. (2) Raramente (se mai) c'è qualche motivo per usare sudo su. Usa  sudoo  su; sceglierne uno. (3) La domanda è scritta in termini di  user1e  user2. Scrivi la tua risposta in termini di  user1e  user2. (Fai o no; non c'è  tri.) (4) La tua risposta sarebbe migliore se includesse una spiegazione di  SI:localuser. ... ... ... ... ... ... ... Per favore, non rispondere nei commenti; modifica la  tua risposta per renderla più chiara e completa.
Scott,
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.