GNU/Linux >> Znalost Linux >  >> Linux

Jak najít odpojené relace xrdp?

Řešení 1:

Zde je způsob, jak získat seznam odpojených relací xrdp. Spoléhá na skutečnost, že xrdp server je při běžném použití správce relací X jediným klientem, který naváže připojení TCP k Xvnc X Window System zobrazovací server. Když je aktivní relace xrdp, má přidružený zobrazovací server Xvnc dvě připojení TCP, jedno ve stavu ESTABLISHED a druhé ve stavu LISTEN. Pomocí lsof(1) to vypadá asi takto program.

$ 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)

Pokud ji uživatel vzdálené relace opustí uzavřením připojení RDP (nebo v případě relace Apache Guacamole RDP zavřením okna prohlížeče), vypadá to asi takto:

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

Všimněte si, že na tomto odpojeném procesu zobrazovacího serveru Xvnc není žádné NASTAVENÉ připojení. Takže každý proces Xvnc, který pouze naslouchá, je odpojená relace.

Zde je skript shellu (pojmenovaný lsdisconnected ), který zobrazuje PID a USER pro každou odpojenou vzdálenou relaci. Používá lsof(1) a gawk(1) implementovat logiku připojení.

#!/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];
              }
          }};
     '

Toto je praktický způsob, jak najít odpojené relace vzdálené plochy; funguje okamžitě po odpojení, aniž by bylo nutné používat dobu nečinnosti.

Pro ty, kteří neznají lsof(1) zde je vysvětlení parametrů příkazového řádku v tomto příkladu.

  • -b -w vyhne se lsof kernel čekání. Tady nejsou potřeba.
  • -n vyhýbá se vyhledávání názvů hostitelů DNS.
  • -c /^Xvnc$/b hledá procesy s přesným názvem příkazu Xvnc pomocí regulárního výrazu.
  • -a říká lsof, aby při filtrování použil AND, nikoli OR.
  • -iTCP:5900-5999 filtry podle portů TCP s čísly 5900 - 5999, které se používají pro připojení displeje X.)

Řešení 2:

Konečně jsem na to našel řešení.
Nejprve jsem musel nainstalovat malý program s názvem xprintidle :

sudo apt-get install xprintidle

Poté jsem napsal malý bash skript, který nejprve načte všechna zobrazení používaná Xvnc a xrdp a poté zkontroluje tyto relace zobrazení, pokud nebyly nečinné déle než několik minut:

#!/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. Jak používat FIND v Linuxu

  2. Jak najít soubor v Linuxu

  3. Jak najít výchozí IP bránu v Linuxu

  1. Jak nainstalovat XRDP na CentOS 7

  2. Jak vyloučit adresář v find . příkaz

  3. Jak zjistit rychlost rozhraní wlan?

  1. Jak integrovat příkaz MV po příkazu Najít?

  2. Jak zhustit podadresáře?

  3. Jak zjistit stav wlan0?