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"