Aqui está uma maneira de obter uma lista de sessões de xrdp desconectadas. Ele se baseia no fato de que o servidor xrdp é, no uso normal do gerenciador de sessões X, o único cliente que estabelece uma conexão TCP com o servidor de exibição Xvnc X Window System. Quando uma sessão xrdp está ativa, o servidor de exibição Xvnc associado tem duas conexões TCP, uma no estado ESTABLISHED e a outra no estado LISTEN. Isso se parece com isso usando o programa lsof (1) .
$ 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 o usuário da sessão remota o abandona fechando a conexão RDP (ou, no caso de uma sessão RDP do Apache Guacamole, fechando a janela do navegador), é algo como isto:
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 não há nenhuma conexão ESTABLISHED neste processo do servidor de exibição Xvnc desconectado. Portanto, qualquer processo Xvnc que esteja apenas ouvindo é uma sessão desconectada.
Aqui está um script de shell (denominado lsdisconnected
) que exibe o PID e o USUÁRIO para cada sessão remota desconectada. Ele usa lsof (1) e gawk (1) para implementar a lógica de conexão.
#!/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 é uma maneira prática de encontrar sessões de área de trabalho remota desconectadas; funciona imediatamente após a desconexão, sem a necessidade de usar um tempo ocioso.
Para quem não está familiarizado com lsof (1) , aqui está uma explicação dos parâmetros da linha de comando neste exemplo.
-
-b -w
evita esperas de kernel lsof. Eles não são necessários aqui.
-
-n
evita pesquisas de DNS para nomes de host.
-
-c /^Xvnc$/b
procura por processos com o nome de comando exato Xvnc, usando um regex.
-
-a
diz ao lsof para usar AND, não OR ao filtrar.
-
-iTCP:5900-5999
filtra por portas TCP numeradas de 5900 a 5999, aquelas usadas para conexões de exibição X.)