GNU/Linux >> Linux Esercitazione >  >> Linux

Come trovare sessioni xrdp disconnesse?

Soluzione 1:

Ecco un modo per ottenere un elenco di sessioni xrdp disconnesse. Si basa sul fatto che xrdp server è, nel normale utilizzo di X session manager, l'unico client che stabilisce una connessione TCP a Xvnc Server di visualizzazione del sistema X Window. Quando una sessione xrdp è attiva, il server di visualizzazione Xvnc associato ha due connessioni TCP, una nello stato ESTABLISHED e l'altra nello stato LISTEN. Sembra qualcosa del genere usando lsof(1) programma.

$ sudo lsof  -b -w -n -c /^Xvnc$/b -a -iTCP:5900-5999 
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
Xvnc    1625 guest    1u  IPv4 252910      0t0  TCP 127.0.0.1:5910 (LISTEN)
Xvnc    1625 guest    9u  IPv4 261226      0t0  TCP 127.0.0.1:5910->127.0.0.1:35242 (ESTABLISHED)

Se l'utente della sessione remota la abbandona chiudendo la connessione RDP (o, nel caso di una sessione Apache Guacamole RDP, chiudendo la finestra del browser) avrà un aspetto simile a questo:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
Xvnc    1625 guest    1u  IPv4 252910      0t0  TCP 127.0.0.1:5910 (LISTEN)

Si noti che non esiste alcuna connessione ESTABLISHED su questo processo del server di visualizzazione Xvnc disconnesso. Quindi, qualsiasi processo Xvnc che è solo in ascolto è una sessione disconnessa.

Ecco uno script di shell (chiamato lsdisconnected ) che visualizza PID e USER per ogni sessione remota disconnessa. Utilizza lsof(1) e gawk(1) per implementare la logica di connessione.

#!/bin/bash
sudo lsof -FRgpLT -b -w -n -c /^Xvnc$/b -a -iTCP:5900-5999  |
gawk '
      match($0,/^p([0-9]+)/,       p) {pid = p[1]; pids[pid]=0; } ;
      match($0,/^L([A-Za-z0-9]+)/, p) {user[pid] = p[1]; } ;
      /TST=LISTEN/ {pids[pid] = pids[pid] - 1 ;};
      /TST=ESTABLISHED/{pids[pid] = pids[pid] + 1};
      END {
          for (pid in pids){
              if (pids[pid] < 0) {
                  print pid, user[pid];
              }
          }};
     '

Questo è un modo pratico per trovare sessioni desktop remote disconnesse; funziona immediatamente dopo la disconnessione, senza bisogno di utilizzare un tempo di inattività.

Per coloro che potrebbero non avere familiarità con lsof(1) ecco una spiegazione dei parametri della riga di comando in questo esempio.

  • -b -w evita lsof kernel attende. Non servono qui.
  • -n evita le ricerche DNS per i nomi host.
  • -c /^Xvnc$/b cerca i processi con il nome esatto del comando Xvnc, utilizzando una regex.
  • -a dice a lsof di usare AND, non OR, durante il filtraggio.
  • -iTCP:5900-5999 filtri in base alle porte TCP numerate 5900 - 5999, quelle utilizzate per le connessioni X display.)

Soluzione 2:

Ho finalmente trovato una soluzione a questo.
Prima di tutto, ho dovuto installare un piccolo programma chiamato xprintidle :

sudo apt-get install xprintidle

Successivamente ho scritto un piccolo script bash che prima recupera tutti i display utilizzati da Xvnc e xrdp e quindi controlla quelle sessioni di visualizzazione se sono rimaste inattive per più di un numero di minuti:

#!/bin/bash

displays=`ps aux | grep Xvnc | grep -v 'grep\|sed' | sed -r 's|.*(Xvnc :[0-9]*).*|\1|' | cut -d' ' -f 2`
limit=180


date
echo "Checking for inactive sessions!"
while read -r d; do
    export DISPLAY=$d
    idle=`xprintidle`
    idleMins=$(($idle/1000/60))
    if [[ $idleMins -gt $limit ]]; then
        echo "WARN Display $d is logged in for longer than ${limit}min (${idleMins}m)"
    else
        echo "INFO Display $d is still ok (${idleMins}m)"
    fi  
done <<< "$displays"

Linux
  1. Come usare TROVA in Linux

  2. Come integrare il comando Mv dopo il comando Trova?

  3. Come escludere una directory in find . comando

  4. Come trovare la velocità dell'interfaccia WLAN?

  5. Come trovare lo stato di wlan0?

Come configurare Xrdp su Xorg in Linux con sessioni multiple

Come trovare la versione di openSUSE

Come trovare la versione di Ubuntu

Come installare Xrdp su Ubuntu 20.04

Come trovare l'ultimo accesso su Linux

Come trovare file in Debian