Solution 1 :
Voici un moyen d'obtenir une liste des sessions xrdp déconnectées. Il repose sur le fait que le xrdp le serveur est, dans l'utilisation normale du gestionnaire de session X, le seul client qui établit une connexion TCP au Xvnc Serveur d'affichage du système X Window. Lorsqu'une session xrdp est active, le serveur d'affichage Xvnc associé dispose de deux connexions TCP, l'une à l'état ESTABLISHED et l'autre à l'état LISTEN. Cela ressemble à ceci en utilisant le lsof(1) programme.
$ 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 l'utilisateur de la session distante l'abandonne en fermant la connexion RDP (ou, dans le cas d'une session Apache Guacamole RDP, en fermant la fenêtre du navigateur), cela ressemble à ceci :
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Xvnc 1625 guest 1u IPv4 252910 0t0 TCP 127.0.0.1:5910 (LISTEN)
Notez qu'il n'y a pas de connexion ESTABLISHED sur ce processus de serveur d'affichage Xvnc déconnecté. Ainsi, tout processus Xvnc qui ne fait qu'écouter est une session déconnectée.
Voici un script shell (nommé lsdisconnected
) qui affiche le PID et l'UTILISATEUR pour chaque session distante déconnectée. Il utilise lsof(1) et regarder(1) pour implémenter la logique de connexion.
#!/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];
}
}};
'
C'est un moyen pratique de trouver des sessions de bureau à distance déconnectées. il fonctionne immédiatement après la déconnexion, sans avoir besoin d'utiliser un temps d'inactivité.
Pour ceux qui ne connaissent peut-être pas lsof(1) voici une explication des paramètres de ligne de commande dans cet exemple.
-b -w
évite les attentes du noyau lsof. Ils ne sont pas nécessaires ici.-n
évite les recherches DNS pour les noms d'hôte.-c /^Xvnc$/b
recherche les processus avec le nom de commande exact Xvnc, en utilisant une expression régulière.-a
indique à lsof d'utiliser AND, et non OR, lors du filtrage.-iTCP:5900-5999
filtres par ports TCP numérotés de 5900 à 5999, ceux utilisés pour les connexions d'affichage X.)
Solution 2 :
J'ai finalement trouvé une solution à cela.
Tout d'abord, j'ai dû installer un petit programme appelé xprintidle
:
sudo apt-get install xprintidle
Après cela, j'ai écrit un petit script bash qui récupère d'abord tous les affichages utilisés par Xvnc et xrdp, puis vérifie ces sessions d'affichage si elles sont inactives depuis plus d'un certain nombre de minutes :
#!/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"