Apakah ada perintah untuk mencantumkan semua tampilan terbuka pada mesin?

76

Ketika SSH secara lokal masuk ke komputer saya (jangan tanya, ini solusinya), saya tidak bisa memulai aplikasi grafis tanpa menjalankan:

export DISPLAY=:0.0

Jika saya menjalankan ini terlebih dahulu dan kemudian menjalankan aplikasi grafis, semuanya berjalan lancar. Jika tidak, itu tidak berfungsi, tidak ada tampilan untuk dilampirkan.

Apakah ada perintah untuk mendaftarkan semua tampilan yang tersedia (yaitu: semua nilai yang mungkin) pada mesin?

Naftuli Kay
sumber
Cara yang lebih bersih untuk meluncurkan aplikasi dari terminal adalah ( DISPLAY=:0 yourapp & ).
nobar
3
Untuk mendapatkan nomor tampilan itu dari skrip baris perintah, coba w. Info lebih lanjut: daftar nama tampilan X yang ada?
aexl

Jawaban:

80

Jika Anda ingin koneksi X diteruskan melalui SSH, Anda harus mengaktifkannya di sisi server dan sisi klien. (Tergantung pada distribusi, dapat diaktifkan atau dinonaktifkan secara default.) Di sisi server, pastikan bahwa Anda memiliki X11Forwarding yesdi /etc/sshd_config(atau /etc/ssh/sshd_configatau di mana pun file konfigurasi). Pada sisi klien, lulus -Xpilihan untuk sshperintah , atau meletakkan ForwardX11di Anda ~/.ssh/config.

Jika Anda menjalankan ssh -X localhost, Anda harus melihat itu $DISPLAY(mungkin) localhost:10.0. Kontras dengan :0.0, yang merupakan nilai ketika Anda tidak terhubung melalui SSH. (Bagian .0mungkin dihilangkan; ini adalah nomor layar, tetapi beberapa layar jarang digunakan.) Ada dua bentuk tampilan X yang mungkin Anda temui:

  • Tampilan lokal, tanpa apa pun sebelum :.
  • Menampilkan TCP, dengan nama host sebelum :.

Dengan ssh -X localhost, Anda dapat mengakses server X melalui kedua tampilan, tetapi aplikasi akan menggunakan metode yang berbeda: :NUMBERmengakses server melalui soket lokal dan memori bersama, sedangkan HOSTNAME:NUMBERmengakses server melalui TCP, yang lebih lambat dan menonaktifkan beberapa ekstensi.

Perhatikan bahwa Anda memerlukan bentuk otorisasi untuk mengakses server X, yang disebut cookie dan biasanya disimpan di belakang layar dalam file ~/.Xauthority. Jika Anda menggunakan ssh untuk mengakses akun pengguna yang berbeda, atau jika distribusi Anda menempatkan cookie dalam file yang berbeda, Anda mungkin menemukan itu DISPLAY=:0tidak berfungsi dalam sesi SSH (tetapi ssh -Xakan, jika diaktifkan di server; Anda tidak pernah perlu dipusingkan XAUTHORITYsaat melakukan ssh -X). Jika itu masalah, Anda perlu mengatur XAUTHORITYvariabel lingkungan atau mendapatkan cookie pengguna lain .

Untuk menjawab pertanyaan Anda yang sebenarnya:

  • Tampilan lokal sesuai dengan soket masuk /tmp/.X11-unix.

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • Remote display sesuai dengan port TCP terbuka di atas 6000; mengakses nomor tampilan N pada mesin M dilakukan dengan menghubungkan ke port TCP 6000 + N pada mesin M. Dari mesin M sendiri:

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

    (Sisa dari poin ini hanya untuk kepentingan akademis.)

    Dari komputer lain, Anda dapat menggunakan nmap -p 6000-6099 host_nameuntuk menyelidiki port TCP terbuka dalam kisaran yang biasa. Saat ini jarang ada server X yang mendengarkan pada soket TCP, terutama di luar antarmuka loopback.

    Sebenarnya, aplikasi lain bisa menggunakan port dalam jangkauan yang biasanya digunakan oleh server X. Anda dapat mengetahui apakah server X sedang mendengarkan dengan memeriksa program mana yang portnya terbuka.

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

    Jika itu menunjukkan sesuatu yang ambigu sshd, tidak ada cara untuk mengetahui dengan pasti apakah itu server X atau kebetulan.

Gilles
sumber
15

Layar adalah argumen pertama Xorg. Anda pskemudian dapat Xorgkeluar.

[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

Anda dapat melakukan awkini ke format mana pun yang Anda inginkan.

Vitor Py
sumber
10
Ini tidak mendeteksi tampilan yang dibuat oleh server selain Xorg, misalnya Xvnc .
cjm
5
ps aux |grep Xbekerja lebih baik untuk saya
nobar
6
wmenunjukkan kepada semua orang yang masuk dan tampilan mereka.
Plenus Franckly
2
Perhatikan bahwa argumen ke Xorg adalah (setidaknya sekarang, pada 2016) opsional dan (setidaknya pada Fedora) biasanya tidak ada, sehingga metode ini tidak lagi berfungsi sama sekali.
BRPocock
Jika karena alasan tertentu hanya mengatur lingkungan var tidak akan selalu bekerja ... coba tambahkan dulu ke perintah DISPLAY=:0 netsurf "https://medium.com/"... atau gunakan export DISPLAY=:0untuk berbagi var dengan proses, bukan hanya shell
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

[Sunting: Saya menjalankan instance Xnest untuk melihat apakah ini akan menangkapnya - tidak; hanya menangkap shell login ('w' adalah kependekan dari 'who'). Kembali ke papan gambar untuk saya.] [Sunting: Ditemukan:

$ ls /tmp/.X11-unix

X0 X2

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

]

Fordi
sumber
1
Itu ... aneh ... Aku ingin tahu apa penjelasannya.
Fordi
(tentang GDM yang berjalan pada layar 1024 untuk saya) Saya tidak bisa mengulanginya untuk kedua kalinya. Pada saat itu saya sedang mencoba xrdp, mengirim forwarding X11 dan beberapa klien VNC. Tampaknya dalam instalasi umum, GDM akan berjalan pada X0 ... atau X1 jika Anda menekan tombol "masuk sebagai pengguna lain" pada layar kunci. Metode kedua Anda bekerja untuk saya di Fedora 23
Ray Foss
Saya menemukan sesuatu pada Display 1024 menggunakan perintah Anda, tetapi saya tidak melihat apa-apa berjalan di sana ... menggunakan ps xeww | grep DISPLAY=:1024sekarang itu aneh. Saya sedang menjalankan chrome-remote-desktop pada layar 20 juga.
Ray Foss
wtidak berfungsi jika tidak ada aplikasi yang berjalan di x server (termasuk tidak ada window manager dan tidak ada desktop). Tetapi ls /tmp/.X11-unixberhasil.
12431234123412341234123
4
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

akan melakukan pekerjaan dengan mendaftar semua TAMPILAN saat ini. Anda juga dapat melihat tampilan yang ditetapkan untuk pengguna tertentu ($ usr) dengan:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
Lenroc
sumber
Apakah yang kedua itu dimaksudkan ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u?
Alexx Roche
0

Dalam /tmpfolder itu juga bisa ada .X??-lockfile dengan ??menunjukkan nomor sesi.

Anda perlu menghapus ini jika Anda ingin menggunakan kembali nomor sesi.

Anda dapat melihatnya menggunakan ls -afile seperti biasa yang dimulai dengan file .yang disembunyikan.

pengguna177936
sumber
Itu adalah sesi tampilan?
phk