it-swarm-tr.com

Bir makinedeki tüm açık ekranları listeleme komutu var mı?

SSH bilgisayarıma yerel olarak girdiğinde (sormayın, bu bir çözümdür), grafik uygulamaları çalıştırmadan başlatamıyorum:

export DISPLAY=:0.0

Bunu önce çalıştırıp sonra grafiksel bir uygulama çalıştırırsam işler yolunda gider. Değilse, çalışmaz, eklenecek ekran yok.

Bir makinede mevcut tüm ekranları (yani: tüm olası değerleri) listelemek için bir komut var mı?

78
Naftuli Kay

X bağlantısının SSH üzerinden iletilmesini istiyorsanız, hem sunucu tarafında hem de istemci tarafında etkinleştirmeniz gerekir. (Dağıtıma bağlı olarak, varsayılan olarak etkinleştirilebilir veya devre dışı bırakılmış olabilir.) Sunucu tarafında, X11Forwarding yes (veya /etc/sshd_config veya yapılandırma dosyasının olduğu her yerde /etc/ssh/sshd_config olduğundan emin olun). İstemci tarafında, -X seçeneğini ssh command adresine iletin veya ForwardX11 klasörüne ~/.ssh/config koyun.

ssh -X localhost çalıştırırsanız, $DISPLAY'nin (muhtemelen) localhost:10.0 olduğunu görmelisiniz. SSH üzerinden bağlı olmadığınızda değer olan :0.0 ile kontrast. (.0 bölümü atlanmış olabilir; bu bir ekran numarasıdır, ancak birden çok ekran nadiren kullanılır.) Muhtemelen karşılaşabileceğiniz iki X ekran şekli vardır:

  • :'den önce hiçbir şey olmadan yerel görüntüler.
  • TCP, :'den önce bir ana bilgisayar adıyla görüntülenir.

ssh -X localhost ile X sunucusuna her iki ekrandan da erişebilirsiniz, ancak uygulamalar farklı bir yöntem kullanacaktır: :NUMBER, yerel soketler ve paylaşılan bellek aracılığıyla sunucuya erişirken, HOSTNAME:NUMBER sunucuya TCP üzerinden erişir, bu da daha yavaştır ve bazı uzantıları devre dışı bırakır.

Çerez adı verilen ve normalde ~/.Xauthority dosyasındaki sahnelerin arkasında saklanan bir X sunucusuna erişmek için bir yetkilendirme biçimine ihtiyacınız olduğunu unutmayın. Farklı bir kullanıcı hesabına erişmek için ssh kullanıyorsanız veya dağıtımınız çerezleri farklı bir dosyaya koyarsa DISPLAY=:0'nin SSH oturumu içinde çalışmadığını görebilirsiniz (ancak sunucuda etkinleştirilmişse ssh -X işlevinin işe yaradığını; ssh -X yaparken asla XAUTHORITY ile uğraşmanıza gerek yoktur). Bu bir sorunsa, XAUTHORITY ortam değişkenini ayarlamanız gerekir veya diğer kullanıcının çerezlerini almanız gerekir .

Asıl sorunuza cevap vermek için:

  • Yerel ekranlar /tmp/.X11-unix'deki bir sokete karşılık gelir.

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • Uzak ekranlar 6000'in üzerindeki açık TCP bağlantı noktalarına karşılık gelir; M makinesindeki ekran numarasına N erişilmesi, M makinesindeki TCP port 6000 + N'ye bağlanarak yapılır.

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

    (Bu madde işaretinin geri kalanı yalnızca akademik ilgi içindir.)

    Başka bir makineden, normal aralıktaki TCP portlarını incelemek için nmap -p 6000-6099 Host_name kullanabilirsiniz. Günümüzde X sunucularının, özellikle geri döngü arabiriminin dışında bir TCP soketini dinlemesi nadirdir.

    Açıkçası, başka bir uygulama genellikle X sunucuları tarafından kullanılan aralıktaki bir bağlantı noktasını kullanıyor olabilir. Hangi programın bağlantı noktasının açık olduğunu kontrol ederek bir X sunucusunun dinleyip dinlemediğini anlayabilirsiniz.

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

    Bu, sshd gibi belirsiz bir şey gösteriyorsa, X sunucusu veya tesadüf olup olmadığından emin olmanın bir yolu yoktur.

Görüntü, Xorg için ilk argüman. ps sonra grep Xorg çıkış yapabilirsiniz.

[[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

Daha sonra, bunu istediğiniz yere awk yapabilirsiniz.

16
Vitor Py
# 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

[Edit: Ben bunu yakalamak için görmek için bir Xnest örnek koştu - değil; yalnızca giriş kabuklarını yakalar ('w' 'kim' için kısadır). Benim için çizim tahtasına geri dön.] [Düzenle: Bulundu:

$ ls /tmp/.X11-unix

X0 X2

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

]

7
Fordi
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

işi tüm mevcut EKRANLARI listeleyerek yapacak. Ayrıca, aşağıdakilerle belirli bir kullanıcıya ($ usr) atanan ekranları görebilirsiniz:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
4
lenroc

/tmp Klasöründe, oturum numaralarını belirten .X??-lock İçeren ?? Dosya da olabilir.

Bir oturum numarasını tekrar kullanmak istiyorsanız bunları silmeniz gerekir.

Bunları ls -a Kullanarak normalde bir . İle başlayan dosyalar gizlendiğinden görebilirsiniz.

0
user177936