Che cos'è XDG_RUNTIME_DIR?


13

Mentre stavo cercando di aprire Evince dalla riga di comando, mi sta dando un errore

neo@Muhammad:~$ sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

Come risolvere questo problema?


1
Dicci di più sul tuo sistema operativo.
DK Bose,

Risposte:


27

Per prima cosa: XDG_RUNTIME_DIR

Per rispondere alla tua prima domanda, "Che cos'è XDG_RUNTIME_DIR?" , è una variabile di ambiente che viene impostata automaticamente al momento dell'accesso. Indica a qualsiasi programma in esecuzione dove trovare una directory specifica dell'utente in cui è possibile memorizzare piccoli file temporanei. Nota che XDG_RUNTIME_DIRè impostato da pam_systemd(8) , quindi non è in realtà correlato a X (eseguendo i programmi graficamente), che è il problema che sembra avere.

Come risolvere

La tua seconda domanda, "Come risolvere questo problema?" è molto buono. Ciò significa che siete interessati, non solo ciò che la correzione è, ma anche come per capirlo da soli. Per iniziare, guarda prima i primi messaggi di errore. In particolare, la ricerca di No protocol specifiedo WARNING **: Could not open X display, dovrebbe mostrarti che il problema è con X (chiamato anche X Windowing System ) che è come i programmi grafici sono mostrati sullo schermo. Sapere che dovrebbe sollevare molte domande di risoluzione dei problemi nella tua mente.

X DISPLAY

La tua prossima domanda potrebbe essere: che cos'è questo "display X" che evince non può aprire? Un "display" è l'indirizzo per il tuo schermo. [*] Qualsiasi programma che vuole scrivere sul tuo schermo deve conoscere l'indirizzo. Puoi vedere qual è il tuo display X controllando la variabile d'ambiente DISPLAY:

echo $DISPLAY

E puoi controllare cosa sudopensa che sia il tuo DISPLAY digitando:

sudo -s
echo $DISPLAY
exit

Se non mostra nulla, questo è il problema. (Vedi correzione di seguito).

XAUTHORITY

Ma cosa succede se questo non è il problema e l' DISPLAYopzione è impostata correttamente sudo? Quindi potresti chiederti, X ha una sorta di permessi che impediscono ad altri utenti di scrivere sul mio display? Se lo pensavi, avresti ragione, X ha due metodi di autorizzazione principali: xauthe xhost. Quello più comunemente usato oggi è xauth(1) che utilizza la XAUTHORITYvariabile d'ambiente. Ancora una volta, controlliamo se è impostato correttamente in sudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Se XAUTHORITYsta puntando a un file nella tua home directory per te, ma è vuoto quando esegui sudo, allora questo è il problema.

FIX: salvare le variabili di ambiente

Allora, qual è la soluzione? Se le variabili di ambiente DISPLAYo o XAUTHORITYnon vengono salvate su sudo, puoi dire a sudo(8) di preservare l'ambiente usando l' -Eopzione, in questo modo:

sudo -E evince

Un modo migliore: env_keep

Potresti chiedere, Aspetta, se -Etutto funziona magicamente, allora perché non è l'impostazione predefinita sudo? La risposta è che si tratta di un potenziale pericolo per la sicurezza. Le variabili di ambiente influiscono sul modo in cui funzionano i programmi e non si desidera che vengano esportati tutti da un account utente alla radice. Il modo "corretto" per farlo è quello di aggiungere la linea Defaults env_keep += "DISPLAY XAUTHORITY"al file sudoers(5) usando visudo(8) . Puoi controllare quali variabili di ambiente sudo conserva eseguendo:

sudo sudo -V

(Sì, digiti sudodue volte). Consiglio di inserire la riga non nel file sudoers predefinito ( /etc/sudoers), ma in un file locale che non verrà sovrascritto quando si aggiorna il sistema. Puoi farlo in questo modo:

sudo visudo -f /etc/sudoers.d/local 

Ma aspetta, e se nessuna delle precedenti funzioni?

Penso che questa sia una risposta abbastanza approfondita, ma se hai ancora problemi, c'è un'altra cosa che suggerirei. Puoi utilizzare xhost(1) per concedere l'accesso a un utente specifico sull'host locale (la tua macchina) in questo modo,

xhost si:localuser:root

In questo caso, stiamo specificando rootcome nome utente, poiché quello è l'account che sudoesegue i programmi come.


[*] : D: Ho solo una schermata, quindi perché un display X ha bisogno di un "indirizzo"? A: È perché X può funzionare non solo sul tuo computer, ma su Internet. Con X , è facile eseguire programmi sul tuo computer che vengono visualizzati su altri host Internet e programmi su altri host che compaiono sullo schermo (supponendo che tu conceda loro l'autorizzazione).


Grazie per la risposta elaborata. Sono sicuro che ci sia almeno qualcosa di nuovo nella tua risposta per ogni utente. (Per me: come concedere l'accesso a X a un utente specifico, che è meglio che emettere xhost +per consentire l'accesso universale.)
drumfire

3

XDG_RUNTIME_DIRè una variabile d'ambiente impostata nel tuo contesto X Windows, in modo che i programmi possano trovare cose. Tu ( neo) hai impostato il contesto grafico.

Provando a eseguire evinceas root, hai inserito la condizione in cui un utente ( root) sta tentando di accedere alla visualizzazione di un altro utente ( neo). Questa è considerata una brutta cosa.

Se decidi che DEVI eseguire un editor grafico come root, leggi man gksudo e usa gksudo.


commento interessante. Ti capita allora di sapere come potrei fare qualcosa del genere? journalctl -b -p err | wl-copyriporta ciò Failed to connect to a Wayland serverche ha senso, ma sembra stupido dal POV dell'utente.
mh-cbon,
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.