it-swarm.it

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

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?

78
Naftuli Kay

Se si desidera inoltrare la connessione X su SSH, è necessario abilitarla sia sul lato server che sul lato client. (A seconda della distribuzione, potrebbe essere abilitato o disabilitato per impostazione predefinita.) Sul lato server, assicurati di avere X11Forwarding yes in /etc/sshd_config (o /etc/ssh/sshd_config o dovunque sia il file di configurazione). Sul lato client, passare il -X all'opzione ssh command oppure inserisci ForwardX11 nella tua ~/.ssh/config .

Se esegui ssh -X localhost, dovresti vedere che $DISPLAY è probabilmente) localhost:10.0. In contrasto con :0.0, che è il valore quando non sei connesso tramite SSH. (Il .0 parte 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, puoi accedere al server X attraverso entrambi i display, ma le applicazioni useranno un metodo diverso: :NUMBER accede al server tramite socket locali e memoria condivisa, mentre HOSTNAME:NUMBER accede al server su TCP, che è più lento e disabilita alcune estensioni.

Tieni presente che hai bisogno di una forma 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=:0 non funziona all'interno della sessione SSH (ma ssh -X lo farà, se è abilitato nel server; non devi mai fare casini con XAUTHORITY quando fai ssh -X). Se questo è un problema, devi impostare la variabile di ambiente XAUTHORITY 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 open TCP porte sopra 6000; l'accesso al numero di display N sulla macchina M viene effettuato collegandosi a TCP porta 6000 + N sulla macchina M. Da 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'altra macchina, puoi usare nmap -p 6000-6099 Host_name per sondare open TCP porte nel solito intervallo. Al giorno d'oggi è raro avere server X in ascolto su un socket TCP, specialmente 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 come sshd, non c'è modo di sapere con certezza se si tratta di un server X o di una coincidenza.

Il display è il primo argomento di Xorg. Puoi ps quindi grep Xorg out.

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

È quindi possibile awk inserirlo in qualsiasi formato sia necessario.

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

[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

]

7
Fordi
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
4
lenroc

Nel /tmp cartella può anche esserci .X??-lock file con ?? indica i numeri di sessione.

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

Puoi vederli usando ls -a come normalmente file che iniziano con un . sono nascosti.

0
user177936