Dlaczego nie mogę uruchamiać aplikacji GUI z poziomu „root”: „Nie określono protokołu”?


38

Zainstalowałem debiana na moim komputerze ostatniej nocy. Teraz nie rozumiem, dlaczego nie mogę uruchamiać aplikacji GUI z terminala, gdy działa jako root.

Na przykład:

sudo -i
glxgears

Generuje następujące dane wyjściowe:

No protocol specified
Error: couldn't open display :0

Ale kiedy po raz pierwszy otwieram terminal, mogę uruchomić glxgearsz konta użytkownika. Dopiero gdy to zrobię sudo -i, problem się pojawia. Dzieje się tak w przypadku dowolnej aplikacji GUI, którą próbuję uruchomić. Myślę, że to prawdopodobnie związane z X11, ale nie jestem pewien.


1
stackoverflow.com/a/20612084 to zadziałało idealnie dla mnie.

Odpowiedzi:


39

Dostęp do serwera X wymaga dwóch rzeczy:

  • $DISPLAYZmienna wskazuje na prawidłową wyświetlaczu (zazwyczaj :0)
  • Prawidłowe informacje uwierzytelniające

Informacje uwierzytelniające mogą być jawnie określone za pomocą $XAUTHORITYi domyślnie są ~/.Xauthorityinne.

Jeśli $DISPLAYi $XAUTHORITYjest ustawione dla twojego użytkownika, sudoustawi je również dla nowej powłoki i wszystko powinno działać dobrze.

Jeśli nie zostaną ustawione, prawdopodobnie domyślnie przyjmą nieprawidłowe wartości i nie będzie można uruchomić aplikacji X.

W Debianie $XAUTHORITYzwykle nie jest jawnie ustawiony. Poprostu dodaj

export XAUTHORITY=~/.Xauthority

do twojego .bashrclub wprost powiedzieć XAUTHORITY=~/.Xauthority sudo ...i wszystko powinno działać.

Możesz także użyć xauth listdo sprawdzenia, czy dostępne są odpowiednie informacje uwierzytelniające.


1
xauth infopokazuje ścieżkę do pliku autoryzacji
Tomas Tomecek,

1
xhost +naprawiono mój problem
niebezpieczeństwo89

3
Należy pamiętać, że xhost +całkowicie dezaktywuje uwierzytelnianie i pozwala wszystkim na dostęp do wszystkich aplikacji na ekranie ...
michas 24.04.2018

1
dla Debiana, czy wpisuję eksport XAUTHORITY jako root? bo to nie działa na deb10? Loguję się za pomocą sudo su
marinara

Używaj @marinara sudo -izamiast sudo su -.
michas

23

Mam takie samo pytanie jak ty, ale dla zwykłego użytkownika. Powiedzmy, że chcę uruchomić Firefoksa przy użyciu konta użytkownika foo. Jestem zalogowany jako pasek:

[bar@localhost ~]$ sudo -u foo -H firefox

Niestety to polecenie nie powiodło się z takim samym błędem jak w pytaniu (tzn. Nie określono protokołu i nie można otworzyć wyświetlacza)

Moim rozwiązaniem było po prostu dodanie foo użytkownika do listy autoryzowanych użytkowników na serwerze X.

xhost si:localuser:foo

I to było to, mogłem wtedy uruchomić Firefoksa (i inną aplikację X) za pomocą sudoi użytkownika foo.

Tło : w X Window jest architektura klient / serwer. Po uruchomieniu aplikacji żądasz autoryzacji serwera X, aby ją wyświetlić. Domyślnie po otwarciu sesji (zalogowaniu się graficznie), Ty (Twój użytkownik) oczywiście możesz komunikować się z serwerem i wyświetlać aplikacje. Inni użytkownicy nie mają tego uprawnienia, chyba że je określisz. xhostto narzędzie do manipulowania listą uprawnień. siWskazuje, że zasada jest po stronie serwera i autoryzacji użytkownika lokalnego foodo aplikacji graficznych. X Window jest pod tym względem bardzo wydajny i można wyświetlać zdalne aplikacje lokalnie, grając ze DISPLAYzmienną środowiskową i xhost(ale nie tylko). W starszych czasach, kiedy ludzie pisali na maszyniexhost + i domyślnie zezwalał wszystkim na korzystanie z sesji X, możliwe było wyświetlanie aplikacji na ekranie dla żartów ;-) obecnie nie tyle, ponieważ ludzie coraz mniej używają architektury klient / serwer X Window (przynajmniej dla tego, co obserwuję w przez ostatnie 10 lat).

PS: Zrobiłem to, aby uruchomić Firefoksa w rodzaju „więzienia” (aby uniknąć podatności takiej jak pdf.js w przyszłości). Szybko jednak przekonałem się, że wywołanie Firefoksa przez sudo nie pozwoli mu uzyskać dostępu do dźwięku ani sprzętu wideo. Ale jest jeden facet, który jasno wyjaśnia, jak włączyć akcelerację sprzętową wideo i dźwięk podczas wywoływania Firefoksa przez sudo . YMMV z tymi instrukcjami, np. Wciąż mam odmowę dostępu do dźwięku, ale wideo jest w porządku (testowane na Fedorze 22 z włączonym SELinux).


1
W moim przypadku foobyło to root, że musiałem uruchomić xhost si:localuser:rootUbuntu 17.10.
Karl Richter,

Gdzie dodajesz xhost si:localhost<user>polecenie? Jeśli żaden użytkownik nie jest zalogowany, nikt nie ma dostępnego serwera X do udzielenia zgody.
cbcoutinho

@cbcoutinho Powyższy przypadek użycia występuje, gdy ktoś jest zalogowany i chce uruchomić aplikację XWindow jako ktoś inny na tym samym hoście. Jeśli wyjaśnisz swój przypadek użycia (jaki jest problem, który chcesz rozwiązać), potencjalnie mogę Ci pomóc.
Huygens,

@Huygens Mam stację roboczą do symulacji płynów, która jest również wyposażona w procesor graficzny. Wizualizacje wykonuję za ParaViewpomocą wbudowanego programu vtk, zwykle na samej stacji roboczej. ParaViewzapewnia także bezpieczny bezobsługowy model renderowania klient / serwer za pośrednictwem ssh, który chciałbym wykorzystać zdalnie zamiast VNC. Bez zalogowania się na stacji roboczej i wykonania xhostnie mogę korzystać z GPU. Oznacza to, że nie mogę ponownie uruchomić komputera zdalnie i nadal mam dostęp do GPU.
cbcoutinho

1
@cbcoutinho X Window to architektura serwera klienta. Kiedy łączysz się przez ssh, lokalna stacja robocza staje się klientem X Window. Możesz użyć xhost z niebezpiecznymi protokołami, takimi jak rlogin, ale nie ssh. Musisz poinstruować ssh, aby zrobił to za ciebie. Albo użyj flagi -Xlub (lepiej?) -YNa ssh, zrobi to właściwe przekierowanie. Oczywiście potrzebujesz lokalnego serwera C. Jednak w przypadku GPU i OpenGL nie jestem pewien, gdzie odbywa się rendering / obliczenia, być może jest to po stronie klienta, a nie po stronie serwera. To może być trudne.
Huygens

10

Możesz albo

Określ wyświetlanie, które ma być używane w wierszu poleceń, dodając -display :0.0

lub

Skonfiguruj zmienną środowiskową w skrypcie logowania użytkownika root (jeden z .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Możesz sprawdzić, czy jest ustawiony,

$ env |grep DISPLAY
DISPLAY=:0.0

Aby otworzyć ekran dla wszystkich użytkowników ze wszystkich hostów jako zwykłego użytkownika, możesz to zrobić za pomocą:

xhost +


1
xhost + działa tymczasowo przed wejściem jako sudo
Octopus

1
xhost +też dla mnie działało, tyle że zapomnieli wspomnieć, że powinniśmy uruchomić go z terminala użytkownika autoryzującego, a nie z terminala pod sudo su.
nyxee

1
idealna praca jak boom
Adiii

3

Biorąc pod uwagę, że korzystasz z Debiana, proste i obsługiwane rozwiązanie polega na sudoskopiowaniu danych uwierzytelniających X11. pam_xauthjest zawarty w libpam-modulespakiecie właśnie do tego celu; aby z niego skorzystać, wystarczy dodać

session  optional  pam_xauth.so

do twojego /etc/pam.d/sudopliku. Możesz także dodać do niego surównież. Aby uzyskać pełne informacje, pam_xauthoczywiście odwiedź stronę podręcznika .


2

Co mi pomogło:

  1. Możesz xauth generate :0 . trustedz userboku, który wygeneruje nowyMIT-MAGIC-COOKIE-1
  2. Sprawdź nowo utworzony klucz ze zmienną xAuthority xauth list' asużytkownika androot (they should be the same if yourwskazuje na ten sam plik.

  3. Voila, rootuzyska dostęp do dowolnego X-Appz terminala, ale tylko tymczasowo.

Aby to zrobić na stałe, zobacz odpowiedź @Huygens!


1

Alternatywne rozwiązanie :

Usługi takie jak cron działający pod rootem nie mają dostępu do wyświetlania, jeśli bieżący użytkownik x nie jest rootem.

Musimy tylko dodać użytkownika root do x, możesz to zrobić podczas logowania za pomocą skryptu startowego

xhost local:root

Do celów testowych możemy po prostu uruchomić niż polecenie pod bieżącym użytkownikiem i ponownie uruchomić skrypt główny / zadanie / usługa / ...


Ciekawe, dlaczego miałbyś uruchamiać aplikację GUI przez crona?
Ośmiornica

w mojej dystrybucji mam zadanie root cron (msec), które sprawdza stan bezpieczeństwa systemu i sporządza raport ... więc zamiast przechodzić do dzienników w celu sprawdzenia tego raportu, wolę mieć wyskakujące okienko z raportem po uruchomieniu tego zadania
intika

TO działało dla mnie
Marcus Vinicius Pompeu

0

sudoKomenda posiada przełącznik do zachowania zmiennych środowiskowych.

 -E, --preserve-env            preserve user environment when running command

Abyś mógł uruchomić polecenie za pomocą przełącznika -E. Przykład:

sudo -E wireshark

Jeśli nie musisz uruchamiać aplikacji o krytycznym znaczeniu dla prywatności, takich jak przeglądarki internetowe, lepiej będzie dodać przełącznik -E z sudo. Nie możemy uruchomić Chrome ani Firefox, dodając przełącznik -E . Ponieważ wiele przeglądarek wdrożyło ochronę przed naruszeniem przestrzeni użytkownika. @ Huygensa męska odpowiedź może mieć wiedzę na ten temat.

Uwaga: Dodanie przełącznika -E nie pomoże, jeśli środowisko użytkownika NIE ma DISPLAY i jest XAUTHORITY już ustawione poprawnie .


-1

użyj tego polecenia i będzie działać

sudo cp /home/user/.Xauthority .Xauthority

2
To da cp: cannot stat ‘/home/user/.Xauthority’: No such file or directoryna każdej z ponad 10 maszyn opartych na Debianie, do których mam dostęp.
Anthon

Daje to mały kontekst (np. Po cichu oczekujesz bieżącego katalogu) i nie wspominasz o efektach ubocznych, takich jak kłopoty, gdy robisz to w wielu instancjach X11. Myślę, że ten sposób jest nieco zuchwały.
v6ak
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.