Как найти разъединенные xrdp сессии?

У меня есть сервер Xubuntu 14.04 здесь, который работает, xrdp, чтобы иметь несколько пользователей соединяются с ним.
Теперь существует одна проблема: пользователи, которые получают доступ к этому серверу через RDP от тонких клиентов Windows часто, используют "X" для закрывания сеанса RDP (поэтому разъединение, но не выход из системы).

Я знаю, что существуют некоторые опции в sesman.ini для контакта с таким поведением, но поскольку в странице справочника говорится, те опции в настоящее время игнорируются (и были в течение многих лет).
Опции, которые решили бы мои проблемы:
KillDisconnected
DisconnectedTimeLimit
IdleTimeLimit

Теперь я должен взломать что-то, что имеет дело с разъединенными сессиями. Моя первая мысль состояла в том, чтобы просто уничтожить всех удаленных пользователей, которые разъединяются - но я не знаю, как получить ту информацию, какие сессии разъединяются.

Так..., как я нахожу разъединенные сессии?
Или: уже есть ли какой-либо предпочтительный способ иметь дело с разъединенными сессиями?

5
задан 6 October 2015 в 16:32
4 ответа

Наконец-то я нашел решение этой проблемы.
Прежде всего, мне пришлось установить небольшую программу под названием xprintidle :

sudo apt-get install xprintidle

После этого я написал небольшой сценарий bash, который сначала извлекает все отображения, используемые Xvnc и xrdp, а затем проверяет эти сеансы отображения, если они ' мы не использовали более нескольких минут:

#!/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"
3
ответ дан 3 December 2019 в 01:24

Вот способ получить список отключенных сеансов xrdp. Он основан на том факте, что сервер xrdp при обычном использовании диспетчера сеансов X является единственным клиентом, который устанавливает TCP-соединение с сервером отображения Xvnc X Window System. Когда сеанс xrdp активен, связанный сервер отображения Xvnc имеет два TCP-соединения, одно в состоянии ESTABLISHED, а другое в состоянии LISTEN. Это выглядит примерно так при использовании программы 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)

Если пользователь удаленного сеанса прерывает его, закрывая соединение RDP (или, в случае сеанса Apache Guacamole RDP, посредством закрытие окна браузера) это выглядит примерно так:

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 нет УСТАНОВЛЕННОГО соединения. Таким образом, любой процесс Xvnc, который только прослушивает, является отключенным сеансом.

Вот сценарий оболочки (с именем lsdisconnected ), который отображает PID и USER для каждого отключенного удаленного сеанса. Он использует lsof (1) и gawk (1) для реализации логики подключения.

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

Это удобный способ найти отключенные сеансы удаленного рабочего стола; он работает сразу после отключения, без необходимости использовать время простоя.

Для тех, кто не знаком с lsof (1) , вот объяснение параметров командной строки в этом примере.

  • -b -w позволяет избежать lsof-ожидания ядра. Они здесь не нужны.
  • -n позволяет избежать поиска имен хостов в DNS.
  • -c / ^ Xvnc $ / b ищет процессы с точным именем команды Xvnc, используя регулярное выражение.
  • -a указывает lsof использовать И, а не ИЛИ при фильтрации.
  • -iTCP: 5900-5999 фильтрует по TCP-портам с номерами 5900–5999, используемым для соединений X-дисплея.)
4
ответ дан 3 December 2019 в 01:24

Спасибо за lsof -fu! Обнаружение «мертвых» сеансов Xvnc было давней проблемой с Xrdp . Я включил О.Код Джонса в сценарий оболочки, который может быть загружен при загрузке и запускаться с экрана для очистки мертвых Xvnc процессов, оставшихся после того, как пользователь закрывает свое окно RDP или когда соединение разрывается по какой-либо причине. Я так и не нашел способа с помощью Xrdp справиться с этим, поэтому этот код lsof идеален.

#!/bin/bash

#
# this could be launched from rc.local via screen
#   echo '/usr/bin/screen -dmS xrdp_cleanup /root/bin/xrdp_cleanup_discod_sessions' | at now
#
while [ 1 ]; do
   # loop through all listening Xvnc processes and make sure there's an established connection
   for pid in `lsof -b -w -n -c /^Xvnc$/b -a -iTCP:5900-5999 | grep L[I]STEN | awk '{print $2};'`; do

      # new sessions may take a second or two on busy systems. 
      # wait for new LISTEN sessions to be become established. this also acts as a throttle for the loop
      sleep 2

      # get user for the established session
      euser=`lsof -b -w -n -c /^Xvnc$/b -a -iTCP:5900-5999 | grep L[I]STEN | grep "$pid" | awk '{print $3};'`
      esta=`lsof -b -w -n -c /^Xvnc$/b -a -iTCP:5900-5999 | grep E[S]TABLISHED | grep "$pid" | awk '{print $2};'`

      test -z "$euser" && echo "Unable to find user in lsof output!"

      if [ -n "$esta" ]; then
         # regular status update
         echo "user $euser has an established sesson on pid $pid"
      else
         isrunning="yes"

         # make sure the process is killed. keep trying.
         while [ -n "$isrunning" ]; do
            echo "Established session for user $euser is gone. killing pid $pid.."
            kill $pid
            sleep 1
            isrunning=`ps -ef | grep $pid | grep -v grep`
            test -z "$isrunning" && echo "$pid killed OK"
         done
      fi
   done
done
0
ответ дан 3 December 2019 в 01:24

Старый пост, но у меня такая же проблема: параметры KillDisconnected/DisconnectedTimeLimit/IdleTimeLimit в sesman.ini неактивны с Xvnc.

Простым решением является добавление этих параметров в sesman.ini в абзаце [Xvnc]:

paramX=-MaxDisconnectionTime
paramX=3600

(где X зависит от того, сколько параметров уже определено)

При этом отключенные сеансы автоматически уничтожаются через 1 час. .

1
ответ дан 4 June 2020 в 08:56

Теги

Похожие вопросы