GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana menemukan sesi xrdp yang terputus?

Solusi 1:

Berikut adalah cara untuk mendapatkan daftar sesi xrdp yang terputus. Itu bergantung pada fakta bahwa xrdp server, dalam penggunaan manajer sesi X normal, satu-satunya klien yang membuat koneksi TCP ke Xvnc Server tampilan Sistem X Window. Saat sesi xrdp aktif, server tampilan Xvnc terkait memiliki dua koneksi TCP, satu dalam status ESTABLISHED, dan yang lainnya dalam status DENGARKAN. Itu terlihat seperti ini menggunakan lsof(1) 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)

Jika pengguna sesi jarak jauh mengabaikannya dengan menutup koneksi RDP (atau, dalam kasus sesi RDP Apache Guacamole, dengan menutup jendela browser) akan terlihat seperti ini:

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

Perhatikan tidak ada koneksi ESTABLISHED pada proses server tampilan Xvnc yang terputus ini. Jadi, setiap proses Xvnc yang hanya mendengarkan adalah sesi yang terputus.

Ini adalah skrip shell (bernama lsdisconnected ) yang menampilkan PID dan USER untuk setiap sesi jarak jauh yang terputus. Ia menggunakan lsof(1) dan melongo(1) untuk mengimplementasikan logika koneksi.

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

Ini adalah cara praktis untuk menemukan sesi desktop jarak jauh yang terputus; itu bekerja segera setelah pemutusan, tanpa perlu menggunakan waktu idle.

Bagi mereka yang mungkin tidak familiar dengan lsof(1) inilah penjelasan tentang parameter baris perintah dalam contoh ini.

  • -b -w menghindari lsof kernel menunggu. Mereka tidak dibutuhkan di sini.
  • -n menghindari pencarian DNS untuk nama host.
  • -c /^Xvnc$/b mencari proses dengan nama perintah yang tepat Xvnc, menggunakan regex.
  • -a memberitahu lsof untuk menggunakan DAN, bukan ATAU, saat memfilter.
  • -iTCP:5900-5999 filter oleh port TCP bernomor 5900 - 5999, yang digunakan untuk koneksi tampilan X.)

Solusi 2:

Saya akhirnya menemukan solusi untuk ini.
Pertama-tama, saya harus memasang program kecil bernama xprintidle :

sudo apt-get install xprintidle

Setelah itu saya menulis skrip bash kecil yang pertama-tama mengambil semua tampilan yang digunakan oleh Xvnc dan xrdp, lalu memeriksa sesi tampilan tersebut jika tidak digunakan selama lebih dari beberapa menit:

#!/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. Cara menggunakan FIND di Linux

  2. Bagaimana Mengintegrasikan Perintah Mv Setelah Menemukan Perintah?

  3. Cara mengecualikan direktori di find . memerintah

  1. Cara menemukan File di Linux

  2. Cara Menginstal XRDP di CentOS 7

  3. Bagaimana cara menyingkat subdirektori?

  1. Cara Menemukan IP Gateway Default di Linux

  2. Bagaimana menemukan kecepatan antarmuka wlan?

  3. Bagaimana cara mengetahui status wlan0?