Bir makinede tüm açık ekranları listelemek için bir komut var mı?


76

SSH yerel olarak bilgisayarıma girdiğinde (sorma, geçici bir çözüm), çalıştırmadan grafiksel uygulamaları başlatamıyorum:

export DISPLAY=:0.0

Önce bunu çalıştırıp sonra da grafik bir uygulamayı çalıştırıyorsam, işler iyi gidiyor. Olmazsa, işe yaramazsa, eklenecek bir ekran yoktur.

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


Bir terminalden uygulamaları başlatmak için daha temiz bir yoldur ( DISPLAY=:0 yourapp & ).
nobar

3
Bu ekran numarasını komut satırı komut dosyasından almak için deneyin w. Daha fazla bilgi: mevcut X görünen adlarını listele?
aexl

Yanıtlar:


80

X bağlantısının SSH üzerinden iletilmesini istiyorsanız, onu hem sunucu hem de istemci tarafında etkinleştirmeniz gerekir. (Dağılımına bağlı olarak, etkin olabilir ya da varsayılan olarak devre.) Sunucu tarafında, sahip olduğundan emin olun X11Forwarding yesiçinde /etc/sshd_config(veya /etc/ssh/sshd_configveya her yerde yapılandırma dosyasıdır). İstemci tarafında, -Xseçeneği sshkomuta iletin veya içine ForwardX11yazın ~/.ssh/config.

Eğer kaçarsan ssh -X localhost, görmelisin ki $DISPLAY(muhtemelen) localhost:10.0. Kontrast :0.0, SSH ile bağlı olmadığınız zamanki değerdir. ( .0Parça atlanabilir; bu bir ekran numarasıdır, ancak birden çok ekran nadiren kullanılır.) Karşılaşmanız muhtemel iki tür X ekranı vardır:

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

İle ssh -X localhost, X sunucusuna her iki ekrandan da erişebilirsiniz, ancak uygulamalar farklı bir yöntem kullanır: :NUMBERsunucuya yerel soketler ve paylaşılan hafıza HOSTNAME:NUMBERüzerinden erişir , oysa sunucuya TCP üzerinden erişir, bu da bazı uzantıları daha yavaş ve devre dışı bırakır.

Çerez olarak adlandırılan ve normalde dosyadaki sahnelerin arkasında saklanan bir X sunucusuna erişmek için bir yetkilendirme şekline ihtiyacınız olduğunu unutmayın ~/.Xauthority. 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=:0bunun SSH oturumunda çalışmadığını görebilirsiniz (ancak ssh -Xsunucuda etkinleştirilmişse çalışacaktır; bulaşmak için gereken XAUTHORITYyaparken ssh -X). Bu bir problemse, ortam değişkenini ayarlamanızXAUTHORITY veya diğer kullanıcı çerezlerini edinmeniz gerekir .

Asıl sorunuzu cevaplamak için:

  • Yerel göstergeler, içindeki bir sokete karşılık gelir /tmp/.X11-unix.

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • Uzak göstergeler 6000'in üzerindeki TCP portlarını açmaya karşılık gelir; M makinesindeki N ekran numarasına erişilmesi, M makinesindeki 6000 + N TCP bağlantı noktasına 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 kısmı sadece akademik ilgi alanına girmiştir.)

    Başka bir makineden, nmap -p 6000-6099 host_namenormal aralıktaki açık TCP portlarını araştırmak için kullanabilirsiniz . Bugünlerde X sunucularının, özellikle geridöngü arabiriminin dışında bir TCP soketinde dinlenmesi 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, belirsiz bir şey gösterirse sshd, bunun bir X sunucusu mu yoksa bir tesadüf mü olduğunu kesin olarak bilemezsiniz.


15

Ekran ilk argümandır Xorg. Daha pssonra grep yapabilirsiniz Xorg.

[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

Bunu daha sonra awkistediğiniz formatta yapabilirsiniz .


10
Bu, Xorg dışındaki bir sunucu tarafından oluşturulan gösterimleri algılamıyor, örneğin Xvnc .
cjm

5
ps aux |grep Xbenim için daha iyi çalıştı
nobar

6
wgiriş yapmış herkesi ve gösterimini gösterir.
Plenus Franckly

2
Xorg argümanının (en azından 2016'da) isteğe bağlı ve (en azından Fedora'da) genellikle bulunmadığına dikkat edin, bu nedenle bu yöntem artık işe yaramaz.
BRPocock,

Eğer herhangi bir nedenden ötürü sadece ortam var ayarını yapmak her zaman işe yaramazsa ... bir komuta hazırlamayı deneyin DISPLAY=:0 netsurf "https://medium.com/"... veya export DISPLAY=:0var olanı işlemle paylaşmak için kullanmayı deneyin , sadece kabuk değil
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

[Düzenle: Bunun yakalanıp yakalanmayacağını görmek için bir Xnest örneği çalıştırdım - değil; yalnızca oturum açma kabukları yakalar ('w', 'kim' için kısadır). Benim için çizim tahtasına dön.] [Düzenle: Buldum:

$ ls /tmp/.X11-unix

X0 X2

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

]


1
Bu ... garip ... Acaba açıklamanın ne olduğunu merak ediyorum.
Fordi

(benim için 1024 numaralı ekranda çalışan GDM ile ilgili olarak) onu ikinci kez çoğaltamıyordum. O zaman xrdp, pencereli X11 yönlendirme ve birkaç VNC istemcisi deniyordum. Tipik bir kurulumda, kilit ekranında "başka bir kullanıcı olarak giriş yap" düğmesine basarsanız GDM X0 ... veya X1 üzerinde çalışacak gibi görünüyor. İkinci metodun benim için Fedora 23'te çalıştı
Ray Foss

Ekran 1024'te komutunuzu kullanarak bir şey buldum, ama orada çalışan hiçbir şey göremiyorum ... ps xeww | grep DISPLAY=:1024şimdi garip. Chrom-remote-desktop'ı 20 numaralı ekranda da çalıştırıyorum.
Ray Foss

wx sunucuda hiçbir uygulama çalışmıyorsa (pencere yöneticisi ve masaüstü yok) çalışmaz. Fakat ls /tmp/.X11-unixişe yarıyor.
12431234123412341234123

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

Geçerli tüm EKRANLARI listeleyerek işi yapacak. Ayrıca, belirli bir kullanıcı için atanmış ekranları ($ usr) ile de görebilirsiniz:

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

İkincisi olması ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -umı gerekiyor ?
Alexx Roche

0

Gelen /tmpklasöründe de olabilir .X??-lockdosyaları ??oturumu numaralarını gösteren.

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

Bunları ls -anormal bir .şekilde kullanarak gizlenmiş bir dosya kullanarak görebilirsiniz .


Bunlar ekran seansları mı?
phk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.