( Zaadaptowano z systemu Linux: wmctrl nie może otworzyć ekranu, gdy sesja jest inicjowana przez ssh + screen )
WYŚWIETLANIE I ORGAN
Program X potrzebuje dwóch informacji, aby połączyć się z wyświetlaczem X.
Potrzebuje adresu wyświetlacza, który zazwyczaj :0
jest zalogowany lokalnie lub :10
, :11
itp., Gdy logujesz się zdalnie (ale liczba może się zmienić w zależności od liczby aktywnych połączeń X). Adres wyświetlacza jest zwykle wskazywany w DISPLAY
zmiennej środowiskowej.
Potrzebuje hasła do wyświetlacza. Hasła wyświetlania X nazywane są magicznymi ciasteczkami . Magiczne pliki cookie nie są określane bezpośrednio: zawsze są przechowywane w plikach autoryzacji X, które są zbiorem zapisów w formie „display :42
ma ciasteczko 123456
”. Plik uprawnień X jest zwykle wskazywany w XAUTHORITY
zmiennej środowiskowej. Jeśli $XAUTHORITY
nie jest ustawiony, programy używają ~/.Xauthority
.
Próbujesz działać w oknach wyświetlanych na pulpicie. Jeśli jesteś jedyną osobą korzystającą z komputera, najprawdopodobniej jest to nazwa wyświetlana :0
. Znalezienie lokalizacji pliku autorytetu X jest trudniejsze, ponieważ z gdm skonfigurowanym w Debian squeeze lub Ubuntu 10.04, znajduje się w pliku o losowo generowanej nazwie. (Wcześniej nie miałeś problemu, ponieważ wcześniejsze wersje gdm korzystały z ustawienia domyślnego, tj. Zapisanych plików cookie ~/.Xauthority
.)
Uzyskiwanie wartości zmiennych
Oto kilka sposobów uzyskania wartości DISPLAY
i XAUTHORITY
:
Możesz systematycznie uruchamiać sesję ekranową z pulpitu, być może automatycznie w skryptach logowania (z ~/.profile
; ale rób to tylko wtedy, gdy logujesz się w X: test, jeśli DISPLAY
jest ustawiona na wartość zaczynającą się od :
(która powinna obejmować wszystkie przypadki, w których prawdopodobnie spotkać)). W ~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
Następnie w sesji ssh:
screen -d -r local
Można również zapisać wartości DISPLAY
i XAUTHORITY
w pliku i przywołać wartości. W ~/.profile
:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
W sesji ssh:
. ~/.local-display-setup.sh
screen
Można wykryć wartości DISPLAY
i XAUTHORITY
od uruchomionego procesu. To jest trudniejsze do zautomatyzowania. Musisz ustalić PID procesu podłączonego do wyświetlacza, nad którym chcesz pracować, a następnie pobrać zmienne środowiskowe z /proc/$pid/environ
( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).
Kopiowanie ciasteczek
Inne podejście (zgodnie z sugestią Arrowmaster ) polega na tym, aby nie próbować uzyskać wartości $XAUTHORITY
w sesji ssh, ale zamiast tego zmusić sesję X do skopiowania plików cookie ~/.Xauthority
. Ponieważ pliki cookie są generowane przy każdym logowaniu, nie ma problemu, jeśli utrzymasz nieaktualne wartości ~/.Xauthority
.
Problem z bezpieczeństwem może wystąpić, jeśli katalog domowy jest dostępny za pośrednictwem NFS lub innego sieciowego systemu plików, który umożliwia zdalnym administratorom przeglądanie jego zawartości. Nadal będą musieli jakoś połączyć się z twoim komputerem, chyba że włączysz połączenia X TCP (domyślnie Debian je wyłącza). Tak więc dla większości osób nie dotyczy to (brak NFS) lub nie stanowi problemu (brak połączeń X TCP).
Aby skopiować pliki cookie podczas logowania do sesji pulpitu X, dodaj następujące wiersze do ~/.xprofile
lub ~/.profile
(lub innego skryptu czytanego podczas logowania):
case $DISPLAY:$XAUTHORITY in
:*:?*)
# DISPLAY is set and points to a local display, and XAUTHORITY is
# set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
¹ Zasadniczo brakuje odpowiedniego cytowania, ale w tym konkretnym przypadku $DISPLAY
i $XAUTHORITY
nie będzie zawierał żadnego metaznaku powłoki.