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ć glxgears
z 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.
Odpowiedzi:
Dostęp do serwera X wymaga dwóch rzeczy:
$DISPLAY
Zmienna wskazuje na prawidłową wyświetlaczu (zazwyczaj:0
)Informacje uwierzytelniające mogą być jawnie określone za pomocą
$XAUTHORITY
i domyślnie są~/.Xauthority
inne.Jeśli
$DISPLAY
i$XAUTHORITY
jest ustawione dla twojego użytkownika,sudo
ustawi 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
$XAUTHORITY
zwykle nie jest jawnie ustawiony. Poprostu dodajdo twojego
.bashrc
lub wprost powiedziećXAUTHORITY=~/.Xauthority sudo ...
i wszystko powinno działać.Możesz także użyć
xauth list
do sprawdzenia, czy dostępne są odpowiednie informacje uwierzytelniające.źródło
xauth info
pokazuje ścieżkę do pliku autoryzacjixhost +
naprawiono mój problemxhost +
całkowicie dezaktywuje uwierzytelnianie i pozwala wszystkim na dostęp do wszystkich aplikacji na ekranie ...sudo -i
zamiastsudo su -
.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:
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.
I to było to, mogłem wtedy uruchomić Firefoksa (i inną aplikację X) za pomocą
sudo
i 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.
xhost
to narzędzie do manipulowania listą uprawnień.si
Wskazuje, że zasada jest po stronie serwera i autoryzacji użytkownika lokalnegofoo
do aplikacji graficznych. X Window jest pod tym względem bardzo wydajny i można wyświetlać zdalne aplikacje lokalnie, grając zeDISPLAY
zmienną środowiskową ixhost
(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).
źródło
foo
było toroot
, że musiałem uruchomićxhost si:localuser:root
Ubuntu 17.10.xhost si:localhost<user>
polecenie? Jeśli żaden użytkownik nie jest zalogowany, nikt nie ma dostępnego serwera X do udzielenia zgody.ParaView
pomocą wbudowanego programuvtk
, zwykle na samej stacji roboczej.ParaView
zapewnia 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 wykonaniaxhost
nie mogę korzystać z GPU. Oznacza to, że nie mogę ponownie uruchomić komputera zdalnie i nadal mam dostęp do GPU.-X
lub (lepiej?)-Y
Na 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.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,
Aby otworzyć ekran dla wszystkich użytkowników ze wszystkich hostów jako zwykłego użytkownika, możesz to zrobić za pomocą:
xhost +
źródło
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 podsudo su
.Biorąc pod uwagę, że korzystasz z Debiana, proste i obsługiwane rozwiązanie polega na
sudo
skopiowaniu danych uwierzytelniających X11.pam_xauth
jest zawarty wlibpam-modules
pakiecie właśnie do tego celu; aby z niego skorzystać, wystarczy dodaćdo twojego
/etc/pam.d/sudo
pliku. Możesz także dodać do niegosu
również. Aby uzyskać pełne informacje,pam_xauth
oczywiście odwiedź stronę podręcznika .źródło
Co mi pomogło:
xauth generate :0 . trusted
zuser
boku, który wygeneruje nowyMIT-MAGIC-COOKIE-1
Sprawdź nowo utworzony klucz ze zmienną xAuthority
xauth list' as
użytkownikaand
root(they should be the same if your
wskazuje na ten sam plik.Voila,
root
uzyska dostęp do dowolnegoX-App
z terminala, ale tylko tymczasowo.Aby to zrobić na stałe, zobacz odpowiedź @Huygens!
źródło
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
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 / ...
źródło
sudo
Komenda posiada przełącznik do zachowania zmiennych środowiskowych.Abyś mógł uruchomić polecenie za pomocą przełącznika -E. Przykład:
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 jestXAUTHORITY
już ustawione poprawnie .źródło
użyj tego polecenia i będzie działać
źródło
cp: cannot stat ‘/home/user/.Xauthority’: No such file or directory
na każdej z ponad 10 maszyn opartych na Debianie, do których mam dostęp.