Co to jest XDG_RUNTIME_DIR?

14

Kiedy próbowałem otworzyć Evince z wiersza poleceń, pojawia się błąd

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:

Jak rozwiązać ten problem?

Muhammad Iliyas
źródło
1
Powiedz nam więcej o swoim systemie operacyjnym.
DK Bose

Odpowiedzi:

30

Najpierw najważniejsze: XDG_RUNTIME_DIR

Aby odpowiedzieć na pierwsze pytanie: „Co to jest XDG_RUNTIME_DIR?” , jest to zmienna środowiskowa, która jest ustawiana automatycznie po zalogowaniu. Informuje każdy uruchomiony program, gdzie znaleźć katalog odpowiedni dla użytkownika, w którym może przechowywać małe pliki tymczasowe. Zauważ, że XDG_RUNTIME_DIRjest ustawiony przez pam_systemd(8) , więc nie jest tak naprawdę związany z X (uruchamianie programów graficznie), co wydaje się mieć problem.

Jak rozwiązywać problemy

Twoje drugie pytanie: „Jak rozwiązać ten problem?” jest bardzo dobry. Oznacza to, że jesteś zainteresowany nie tylko tym, co to jest poprawka, ale także tym, jak samodzielnie ją rozwiązać. Aby rozpocząć, najpierw spójrz na pierwsze komunikaty o błędach. W szczególności poszukiwanie No protocol specifiedlub WARNING **: Could not open X displaypowinno pokazać, że problem dotyczy X (zwanego także The X Windowing System ), czyli sposobu wyświetlania programów graficznych na ekranie. Świadomość, że powinno to wywołać wiele pytań dotyczących rozwiązywania problemów.

X WYŚWIETLACZ

Twoje następne pytanie może brzmieć: co to za „wyświetlacz X”, którego ewangelii nie można otworzyć? „Wyświetlacz” to adres twojego ekranu. [*] Każdy program, który chce pisać na ekranie, musi znać adres. Możesz zobaczyć, jaki jest Twój ekran X, sprawdzając zmienną środowiskową DISPLAY:

echo $DISPLAY

I możesz sprawdzić, co sudomyśli Twój WYŚWIETLACZ, wpisując:

sudo -s
echo $DISPLAY
exit

Jeśli nic nie pokazuje, to jest problem. (Patrz poprawka poniżej).

XAUTHORITY

Ale co, jeśli to nie jest problem i DISPLAYjest on poprawnie ustawiony sudo? Możesz się zastanawiać, czy X ma jakieś uprawnienia, które uniemożliwiają innym użytkownikom pisanie na moim ekranie? Jeśli tak uważasz, masz rację, X ma dwie główne metody autoryzacji: xauthi xhost. Najpopularniejszym obecnie jest xauth(1), który korzysta ze XAUTHORITYzmiennej środowiskowej. Ponownie sprawdźmy, czy jest poprawnie ustawiony w sudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Jeśli XAUTHORITYwskazuje plik w twoim katalogu domowym, ale po uruchomieniu jest pusty sudo, to jest problem.

POPRAWKA: Zapisz zmienne środowiskowe

Więc jaka jest poprawka? Jeśli zmienne środowiskowe DISPLAYlub XAUTHORITYśrodowiskowe nie są zapisywane w poprzek sudo, możesz powiedzieć sudo(8), aby chronić środowisko, korzystając z -Eopcji:

sudo -E evince

Lepszy sposób: env_keep

Możesz zapytać: Czekaj, jeśli -Esprawia , że wszystko działa magicznie, to dlaczego nie jest to ustawienie domyślne sudo? Odpowiedź jest taka, że ​​jest to potencjalne zagrożenie bezpieczeństwa. Zmienne środowiskowe wpływają na działanie programów i nie chcesz, aby wszystkie były eksportowane z konta użytkownika do katalogu głównego. „Prawidłowym” sposobem na to jest dodanie linii Defaults env_keep += "DISPLAY XAUTHORITY"do pliku sudoers(5) za pomocą visudo(8) . Możesz sprawdzić, jakie zmienne środowiskowe sudo zachowuje, uruchamiając:

sudo sudo -V

(Tak, piszesz sudodwa razy). Zalecam umieszczenie wiersza nie w domyślnym pliku sudoers ( /etc/sudoers), ale w pliku lokalnym, który nie zostanie zastąpiony podczas aktualizacji systemu. Możesz to zrobić w następujący sposób:

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

Ale poczekaj, co jeśli żadne z powyższych nie zadziała?

Myślę, że to dość dokładna odpowiedź, ale jeśli nadal masz problemy, zasugeruję jeszcze jedną rzecz. Możesz użyć xhost(1), aby udzielić dostępu konkretnemu użytkownikowi na lokalnym hoście (twoim komputerze),

xhost si:localuser:root

W tym przypadku określamy rootjako nazwę użytkownika, ponieważ jest to konto, na którym sudouruchamiane są programy jako.


[*] : P: Mam tylko jeden ekran, więc dlaczego wyświetlacz X potrzebuje „adresu”? Odp .: To dlatego, że X może działać nie tylko na twoim komputerze, ale także przez Internet. Dzięki X łatwo jest uruchamiać programy na komputerze, które wyświetlają się na innych hostach internetowych i programy na innych hostach, które pojawiają się na ekranie (zakładając, że dasz im na to zgodę).

hackerb9
źródło
Dziękuję za wyszukaną odpowiedź. Jestem pewien, że w Twojej odpowiedzi jest co najmniej coś nowego dla każdego użytkownika. (Dla mnie: jak przyznać dostęp do X określonemu użytkownikowi, co jest lepsze niż wydanie w xhost +celu umożliwienia powszechnego dostępu.)
drumfire
3

XDG_RUNTIME_DIRjest zmienną środowiskową ustawioną w kontekście X Windows, dzięki czemu programy mogą znajdować rzeczy. Ty ( neo) skonfigurowałeś kontekst graficzny.

Próbując uruchomić evincejako root, wprowadzono warunek, w którym użytkownik ( root) próbuje uzyskać dostęp do neoekranu innego użytkownika ( ). Jest to uważane za złą rzecz.

Jeśli zdecydujesz, że MUSISZ uruchomić edytor graficzny root, przeczytaj man gksudo i skorzystaj z niego gksudo.

waltinator
źródło
ciekawy komentarz. Czy wiesz, jak mogłem zrobić coś takiego? journalctl -b -p err | wl-copyraportuje, Failed to connect to a Wayland serverco ma sens, ale brzmi głupio z POV użytkownika.
mh-cbon