Czy istnieje polecenie, aby wyświetlić listę wszystkich otwartych ekranów na komputerze?

76

Po SSH lokalnie na moim komputerze (nie pytaj, to obejście), nie mogę uruchomić aplikacji graficznych bez uruchamiania:

export DISPLAY=:0.0

Jeśli najpierw uruchomię to, a następnie uruchomię aplikację graficzną, wszystko się ułoży. Jeśli nie, to nie działa, nie ma wyświetlacza do podłączenia.

Czy istnieje polecenie wyświetlania wszystkich dostępnych ekranów (tj. Wszystkich możliwych wartości) na komputerze?

Naftuli Kay
źródło
Czystszym sposobem uruchamiania aplikacji z terminala jest ( DISPLAY=:0 yourapp & ).
nobar
3
Aby uzyskać ten wyświetlany numer ze skryptu wiersza polecenia, spróbuj w. Więcej informacji: wymienić istniejące X wyświetlane nazwy?
aexl 18.04.16

Odpowiedzi:

80

Jeśli chcesz, aby połączenie X było przekazywane przez SSH, musisz włączyć je zarówno po stronie serwera, jak i klienta. (W zależności od dystrybucji, może być włączona lub wyłączona domyślnie). Po stronie serwera, upewnij się, że masz X11Forwarding yesw /etc/sshd_config(lub /etc/ssh/sshd_configlub wszędzie tam, gdzie jest plik konfiguracyjny). Po stronie klienta przekaż -Xopcję do sshpolecenia lub wprowadź ForwardX11swoją ~/.ssh/config.

Jeśli uruchomisz ssh -X localhost, powinieneś zobaczyć $DISPLAY(prawdopodobnie) localhost:10.0. Porównaj z :0.0, co jest wartością, gdy nie masz połączenia przez SSH. ( .0Część można pominąć; jest to numer ekranu, ale rzadko używa się wielu ekranów.) Istnieją dwie formy wyświetlaczy X, z którymi możesz się kiedykolwiek spotkać:

  • Wyświetlacze lokalne, bez niczego przed :.
  • Wyświetla się TCP z nazwą hosta przed :.

Za pomocą ssh -X localhostmożna uzyskać dostęp do serwera X za pośrednictwem obu ekranów, ale aplikacje będą używać innej metody: :NUMBERuzyskuje dostęp do serwera za pośrednictwem lokalnych gniazd i pamięci współużytkowanej, podczas gdy HOSTNAME:NUMBERuzyskuje dostęp do serwera przez TCP, który jest wolniejszy i wyłącza niektóre rozszerzenia.

Pamiętaj, że potrzebujesz formy autoryzacji dostępu do serwera X, zwanej ciasteczkiem i zwykle przechowywanej za kulisami w pliku ~/.Xauthority. Jeśli używasz ssh, aby uzyskać dostęp do innego konta użytkownika lub jeśli twoja dystrybucja umieszcza pliki cookie w innym pliku, może się okazać, że DISPLAY=:0to nie działa w sesji SSH (ale ssh -Xbędzie, jeśli jest włączone na serwerze; nigdy nie trzeba zadzierać z XAUTHORITYkiedy robi ssh -X). Jeśli to jest problem, musisz ustawić XAUTHORITYzmienną środowiskową lub uzyskać pliki cookie drugiego użytkownika .

Aby odpowiedzieć na twoje aktualne pytanie:

  • Lokalne wyświetlacze odpowiadają gniazdu wejściowemu /tmp/.X11-unix.

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • Zdalne wyświetlacze odpowiadają otwartym portom TCP powyżej 6000; dostęp do numeru N na komputerze M odbywa się poprzez połączenie z portem TCP 6000 + N na komputerze M. Z samego komputera M:

    netstat -lnt | awk '
      sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
        print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
      }'
    

    (Reszta tego punktu jest interesująca tylko dla naukowców.)

    Z innego komputera możesz użyć nmap -p 6000-6099 host_namedo sondowania otwartych portów TCP w zwykłym zakresie. W dzisiejszych czasach rzadko serwery X nasłuchują na gnieździe TCP, szczególnie poza interfejsem pętli zwrotnej.

    Ściśle mówiąc, inna aplikacja może korzystać z portu w zakresie zwykle używanym przez serwery X. Możesz stwierdzić, czy serwer X nasłuchuje, sprawdzając, który program ma otwarty port.

    lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
    

    Jeśli pokazuje to coś niejednoznacznego sshd, nie ma sposobu, aby się upewnić, czy jest to serwer X, czy przypadek.

Gilles
źródło
15

Wyświetlenie jest pierwszym argumentem do Xorg. psNastępnie możesz się Xorgwyrzucić.

[braga@coleman teste_geom]$ ps aux | grep Xorg
root      1584  5.3  1.0 156628 41708 tty1     Rs+  Jul22  22:56 /usr/bin/Xorg :0 -background none -verbose -auth /var/run/gdm/auth-for-gdm-a3kSKB/database -nolisten tcp vt1
braga     9110  0.0  0.0 109104   804 pts/1    S+   00:26   0:00 grep --color=auto Xorg

Następnie możesz to zrobić awkw dowolnym formacie.

Vitor Py
źródło
10
Nie wykrywa to ekranów utworzonych przez serwer inny niż Xorg, np . Xvnc .
cjm
5
ps aux |grep Xpracował dla mnie lepiej
nobar
6
wpokazuje wszystkim zalogowanym i ich wyświetlenie.
Plenus Franckly,
2
Zauważ, że argument na Xorg jest (przynajmniej teraz w 2016 r.) Opcjonalny i (przynajmniej na Fedorze) zwykle nieobecny, więc ta metoda już nie działa.
BRPocock,
Jeśli z jakiegoś powodu po prostu ustawienie środowiska var nie zawsze będzie działać ... spróbuj dodać go do polecenia DISPLAY=:0 netsurf "https://medium.com/"... lub użyj go export DISPLAY=:0do udostępnienia var procesowi, a nie tylko powłoce
Ray Foss
7
# Show all active login shells, with displays
$ w -oush

trunc-us tty1                      23:02  -bash
trunc-us tty7     :0                4days /sbin/upstart --user
trunc-us pts/4    :0                      w -oush

# Capture the Display part
$ w -oush | grep -Eo ' :[0-9]+'

 :0
 :0

# only unique lines
$ w -oush | grep -Eo ' :[0-9]+' | uniq

 :0

# trim off the leading space
$ w -oush | grep -Eo ' :[0-9]+' | uniq | cut -d \  -f 2

[Edycja: Uruchomiłem instancję Xnest, aby zobaczyć, czy to złapie - to nie; przechwytuje tylko powłoki logowania („w” jest skrótem od „kto”). Wróć do tablicy kreślarskiej.] [Edytuj: Znaleziono:

$ ls /tmp/.X11-unix

X0 X2

$ ls /tmp/.X11-unix | tr 'X' ':'
:0
:2

]

Fordi
źródło
1
To ... dziwne ... Zastanawiam się, jakie jest wytłumaczenie.
Fordi,
(dotyczy GDM działającego na wyświetlaczu 1024) Nie mogłem go powtórzyć. W tym czasie wypróbowałem xrdp, przekierowałem X11 do okien i kilku klientów VNC. Wygląda na to, że w typowej instalacji GDM uruchomi się na X0 ... lub X1, jeśli naciśniesz przycisk „Zaloguj się jako inny użytkownik” na ekranie blokady. Twoja druga metoda zadziałała dla mnie na Fedorze 23
Ray Foss,
Znalazłem coś na Display 1024 za pomocą twojego polecenia, ale nie widzę, żeby tam działało ... używając ps xeww | grep DISPLAY=:1024teraz to dziwne. Korzystam również z Chrome-Remote-Desktop na wyświetlaczu 20.
Ray Foss,
wnie działa, jeśli na serwerze x nie działa żadna aplikacja (w tym brak menedżera okien i pulpitu). Ale ls /tmp/.X11-unixdziała.
12431234123412341234123
3
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

wykona zadanie, wymieniając wszystkie aktualne WYŚWIETLACZE. Możesz także zobaczyć przypisane ekrany dla konkretnego użytkownika ($ usr) za pomocą:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
Lenroc
źródło
Czy to ma być ten drugi ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u?
Alexx Roche,
0

W /tmpfolderze mogą znajdować się również .X??-lockpliki ze ??wskazaniem numerów sesji.

Musisz je usunąć, jeśli chcesz ponownie użyć numeru sesji.

Można je zobaczyć, ls -ajak zwykle używane są pliki zaczynające się od a .są ukryte.

użytkownik177936
źródło
To są sesje wystawowe?
phk