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.