Esiste un comando per elencare tutti i display aperti su una macchina?


76

Quando SSH si avviava localmente sul mio computer (non chiedere, è una soluzione alternativa), non posso avviare applicazioni grafiche senza eseguire:

export DISPLAY=:0.0

Se eseguo prima questo e poi eseguo un'applicazione grafica, le cose funzionano. In caso contrario, non funziona, non è necessario collegare alcun display.

Esiste un comando per elencare tutti i display disponibili (ovvero: tutti i valori possibili) su una macchina?


Un modo più pulito per avviare le applicazioni da un terminale è ( DISPLAY=:0 yourapp & ).
nobar,

3
Per ottenere quel numero visualizzato da uno script della riga di comando, provare w. Ulteriori informazioni: elencare i nomi di visualizzazione X esistenti?
aexl,

Risposte:


80

Se si desidera inoltrare la connessione X su SSH, è necessario abilitarla sia sul lato server che sul lato client. (A seconda della distribuzione, può essere abilitata o disabilitata per default.) Sul lato server, assicurarsi di avere X11Forwarding yesa /etc/sshd_config(o /etc/ssh/sshd_configo dovunque il file di configurazione è). Sul lato client, passa l' -Xopzione al sshcomando o inserisci il ForwardX11tuo ~/.ssh/config.

Se corri ssh -X localhost, dovresti vedere che $DISPLAYè (probabilmente) localhost:10.0. Contrasto con :0.0, che è il valore quando non sei connesso tramite SSH. (La .0parte può essere omessa; è un numero di schermata, ma raramente vengono utilizzate più schermate.) Esistono due forme di display X che probabilmente incontrerai mai:

  • Display locali, con nulla prima del :.
  • TCP viene visualizzato, con un nome host prima del :.

Con ssh -X localhost, è possibile accedere al server X attraverso entrambi i display, ma le applicazioni useranno un metodo diverso: :NUMBERaccede al server tramite socket locali e memoria condivisa, mentre HOSTNAME:NUMBERaccede al server su TCP, che è più lento e disabilita alcune estensioni.

Si noti che è necessario un modulo di autorizzazione per accedere a un server X, chiamato cookie e normalmente archiviato dietro le quinte nel file ~/.Xauthority. Se stai usando ssh per accedere a un altro account utente o se la tua distribuzione inserisce i cookie in un file diverso, potresti scoprire che DISPLAY=:0non funziona all'interno della sessione SSH (ma ssh -X, se è abilitato nel server; non puoi mai bisogno di pasticciare XAUTHORITYquando si fa ssh -X). Se questo è un problema, è necessario impostare la XAUTHORITYvariabile di ambiente o ottenere i cookie dell'altro utente .

Per rispondere alla tua vera domanda:

  • I display locali corrispondono a un socket in /tmp/.X11-unix.

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • I display remoti corrispondono a porte TCP aperte sopra 6000; l'accesso al numero di visualizzazione N sulla macchina M viene effettuato collegandosi alla porta TCP 6000 + N sulla macchina M. Dalla macchina M stessa:

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

    (Il resto di questo punto elenco è solo di interesse accademico.)

    Da un altro computer, è possibile utilizzare nmap -p 6000-6099 host_nameper sondare le porte TCP aperte nell'intervallo usuale. Al giorno d'oggi è raro avere server X in ascolto su un socket TCP, soprattutto al di fuori dell'interfaccia di loopback.

    A rigor di termini, un'altra applicazione potrebbe utilizzare una porta nell'intervallo normalmente utilizzato dai server X. Puoi sapere se un server X è in ascolto controllando quale programma ha la porta aperta.

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

    Se questo mostra qualcosa di ambiguo sshd, non c'è modo di sapere con certezza se si tratta di un server X o di una coincidenza.


15

Il display è il primo argomento a Xorg. È psquindi possibile grep Xorgout.

[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

È quindi possibile awkfarlo in qualsiasi formato sia necessario.


10
Questo non rileva i display creati da un server diverso da Xorg, ad esempio Xvnc .
cjm

5
ps aux |grep Xha funzionato meglio per me
nobar,

6
wmostra tutti coloro che hanno effettuato l'accesso e il loro display.
Plenus Franckly,

2
Nota che l'argomento di Xorg è (almeno ora, nel 2016) facoltativo e (almeno su Fedora) di solito assente, quindi questo metodo non funziona più.
BRPocock,

Se per qualche motivo la semplice impostazione dell'ambiente var non funzionasse sempre ... prova a anteporre a un comando DISPLAY=:0 netsurf "https://medium.com/"... o usare export DISPLAY=:0per condividere la var con il processo, non solo con la 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

[Modifica: ho eseguito un'istanza di Xnest per vedere se questo l'avrebbe presa - non lo fa; cattura solo shell di login ('w' è l'abbreviazione di 'who'). Torna al tavolo da disegno per me.] [Modifica: Trovato:

$ ls /tmp/.X11-unix

X0 X2

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

]


1
È ... strano ... Mi chiedo quale sia la spiegazione.
Fordi,

(per quanto riguarda GDM in esecuzione sul display 1024 per me) Non ho potuto replicarlo una seconda volta. All'epoca stavo provando xrdp, l'inoltro X11 con finestre e alcuni client VNC. Sembra che in un'installazione tipica, GDM funzionerà su X0 ... o X1 se hai premuto il pulsante "Accedi come un altro utente" nella schermata di blocco. Il tuo secondo metodo ha funzionato per me su Fedora 23
Ray Foss il

Ho trovato qualcosa su Display 1024 usando il tuo comando, ma non vedo nulla che corre lì ... usando ps xeww | grep DISPLAY=:1024ora è strano. Sto eseguendo anche Chrome-Remote-Desktop sul display 20.
Ray Foss

wnon funziona se nessuna applicazione è in esecuzione sul server x (incluso nessun gestore delle finestre e nessun desktop). Ma ls /tmp/.X11-unixfunziona.
12431234123412341234123

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

farà il lavoro elencando tutti gli attuali DISPLAY. Inoltre puoi vedere i display assegnati per un utente specifico ($ usr) con:

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

Quel secondo è destinato ad essere ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u?
Alexx Roche,

0

Nella /tmpcartella possono essere .X??-lockpresenti anche file con l' ??indicazione dei numeri di sessione.

È necessario eliminarli se si desidera riutilizzare un numero di sessione.

Puoi vederli usando ls -acome normalmente i file che iniziano con un .sono nascosti.


Quelle sono le sessioni di visualizzazione?
phk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.