Když SSH lokálně do mého počítače (neptejte se, je to řešení), nemůžu spustit grafické aplikace bez spuštění:
export DISPLAY=:0.0
Pokud spustím toto první a poté grafickou aplikaci, vše dopadne. Pokud ne, nefunguje to, není k dispozici žádný displej, ke kterému se lze připojit.
Existuje příkaz pro výpis všech dostupných displejů (tj .: všechny možné hodnoty) na počítači?
Pokud chcete přesměrovat připojení X přes SSH, musíte jej povolit na straně serveru i klienta. (V závislosti na distribuci může být ve výchozím nastavení povoleno nebo zakázáno.) Na straně serveru se ujistěte, že máte X11Forwarding yes
V /etc/sshd_config
(nebo /etc/ssh/sshd_config
Nebo kdekoli je konfigurační soubor). Na straně klienta předejte možnost -X
ssh
příkaz , nebo vložte do svého ForwardX11
~/.ssh/config
.
Pokud spustíte ssh -X localhost
, Měli byste vidět, že $DISPLAY
Je (pravděpodobně) localhost:10.0
. Kontrast s :0.0
, Což je hodnota, když nejste připojeni přes SSH. (Část .0
Může být vynechána; je to číslo obrazovky, ale více obrazovek se používá zřídka.) Existují dvě formy X displejů, s nimiž se pravděpodobně setkáte:
:
.:
.S ssh -X localhost
Můžete přistupovat k X serveru přes obě displeje, ale aplikace budou používat jinou metodu: :NUMBER
Přistupuje k serveru prostřednictvím lokálních soketů a sdílené paměti, zatímco HOSTNAME:NUMBER
přistupuje k serveru přes TCP, což je pomalejší a deaktivuje některá rozšíření.
Nezapomeňte, že pro přístup k serveru X potřebujete formu autorizace nazvanou cookie a obvykle uloženou za scénami v souboru ~/.Xauthority
. Pokud používáte ssh pro přístup k jinému uživatelskému účtu nebo pokud vaše distribuce umístí soubory cookie do jiného souboru, možná zjistíte, že DISPLAY=:0
Nefunguje v relaci SSH (ale ssh -X
, pokud je to povoleno na serveru; při provádění ssh -X
nemusíte nikdy mluvit s XAUTHORITY
. Pokud se jedná o problém, musíte nastavit proměnnou prostředí XAUTHORITY
nebo získat soubory cookie jiného uživatele .
Chcete-li odpovědět na aktuální otázku:
Místní displeje odpovídají soketu v /tmp/.X11-unix
.
(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
Vzdálené displeje odpovídají otevřeným TCP portům nad 6000; přístup k zobrazovacímu číslu N na počítači M se provádí připojením k portu TCP 6000 + N na počítači M. Ze samotného stroje M:
netstat -lnt | awk '
sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
}'
(Zbytek této odrážky je pouze v akademickém zájmu.)
Z jiného počítače můžete pomocí nmap -p 6000-6099 Host_name
Zkoušet otevřené TCP porty v obvyklém rozsahu. Dnes je vzácné, že X servery poslouchají na soketu TCP, zejména mimo rozhraní zpětného smyčky.
Přesně řečeno, jiná aplikace by mohla používat port v rozsahu obvykle používaném X servery. Můžete zjistit, zda server X poslouchá kontrolou toho, který program má port otevřený.
lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
Pokud se ukáže něco dvojznačného, jako je sshd
, neexistuje žádný způsob, jak zjistit, zda se jedná o server X nebo náhoda.
Displej je prvním argumentem Xorg
. Můžete ps
potom grep Xorg
out.
[[email protected] 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
Poté můžete awk
do jakéhokoli formátu, který potřebujete.
# 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
[Upravit: Spustil jsem Xnest instanci, abych zjistil, jestli by to chytilo - ne; zachycuje pouze přihlašovací skořepiny („w“ je zkratka pro „who“). Zpět na rýsovací prkno pro mě.] [Upravit: Nalezeno:
$ ls /tmp/.X11-unix
X0 X2
$ ls /tmp/.X11-unix | tr 'X' ':'
:0
:2
]
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
provede úlohu tím, že uvede všechny aktuální DISPLEJE. Také můžete vidět přiřazené displeje pro konkrétního uživatele ($ usr) s:
ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
V /tmp
složka může také existovat .X??-lock
soubory s ??
označující čísla relací.
Pokud chcete číslo relace znovu použít, musíte je odstranit.
Můžete je vidět pomocí ls -a
jako obvykle soubory začínající znakem .
jsou skryté.