Solución 1:
Aquí hay una forma de obtener una lista de sesiones xrdp desconectadas. Se basa en el hecho de que xrdp El servidor es, en el uso normal del administrador de sesión X, el único cliente que establece una conexión TCP con Xvnc Servidor de visualización del sistema X Window. Cuando una sesión xrdp está activa, el servidor de pantalla Xvnc asociado tiene dos conexiones TCP, una en el estado ESTABLECIDO y la otra en el estado LISTEN. Eso se parece a esto usando lsof(1) programa.
$ 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)
Si el usuario de la sesión remota la abandona cerrando la conexión RDP (o, en el caso de una sesión Apache Guacamole RDP, cerrando la ventana del navegador), se verá así:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Xvnc 1625 guest 1u IPv4 252910 0t0 TCP 127.0.0.1:5910 (LISTEN)
Observe que no hay una conexión ESTABLECIDA en este proceso del servidor de pantalla Xvnc desconectado. Entonces, cualquier proceso Xvnc que solo esté escuchando es una sesión desconectada.
Aquí hay un script de shell (llamado lsdisconnected
) que muestra el PID y el USUARIO para cada sesión remota desconectada. Utiliza lsof(1) y bostezar(1) para implementar la lógica de conexión.
#!/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];
}
}};
'
Esta es una forma práctica de encontrar sesiones de escritorio remoto desconectadas; funciona inmediatamente después de la desconexión, sin necesidad de usar un tiempo de inactividad.
Para aquellos que no estén familiarizados con lsof(1) aquí hay una explicación de los parámetros de la línea de comando en este ejemplo.
-b -w
evita las esperas del núcleo lsof. No son necesarios aquí.-n
evita las búsquedas DNS de nombres de host.-c /^Xvnc$/b
busca procesos con el nombre de comando exacto Xvnc, usando una expresión regular.-a
le dice a lsof que use AND, no OR, al filtrar.-iTCP:5900-5999
filtros por puertos TCP numerados 5900 - 5999, los que se utilizan para las conexiones de visualización X.)
Solución 2:
Finalmente encontré una solución a esto.
En primer lugar, tuve que instalar un pequeño programa llamado xprintidle
:
sudo apt-get install xprintidle
Después de eso, escribí un pequeño script bash que primero busca todas las pantallas utilizadas por Xvnc y xrdp y luego verifica esas sesiones de visualización si han estado inactivas durante más de una cantidad de minutos:
#!/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"