加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 如何找到断开连接的xrdp会话?

发布时间:2020-12-14 03:07:02 所属栏目:Linux 来源:网络整理
导读:我这里有一台运行xrdp的Xubuntu 14.04服务器让几个用户连接到它. 现在有一个问题:通过RDP从 Windows瘦客户端访问此服务器的用户通常使用“X”来关闭RDP会话(因此断开但不注销). 我知道sesman.ini中有一些选项来处理这种行为,但正如联机帮助页所说,这些选项
我这里有一台运行xrdp的Xubuntu 14.04服务器让几个用户连接到它.
现在有一个问题:通过RDP从 Windows瘦客户端访问此服务器的用户通常使用“X”来关闭RDP会话(因此断开但不注销).

我知道sesman.ini中有一些选项来处理这种行为,但正如联机帮助页所说,这些选项目前被忽略(并且已经存在多年).
可以解决我的问题的选项是:
KillDisconnected
DisconnectedTimeLimit
IdleTimeLimit

现在我需要破解处理断开连接的会话的东西.我的第一个想法是杀死所有断开连接的远程用户 – 但我不知道如何获取会话断开的信息.

那么……我如何找到断开连接的会话?
或者:是否已经有任何首选方式来处理断开连接的会话?

解决方法

这是一种获取断开连接的xrdp会话列表的方法.它依赖于以下事实:在正常的X会话管理器使用中,xrdp服务器是唯一建立到Xvnc X Window System显示服务器的TCP连接的客户端.当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显示服务器进程没有ESTABLISHED连接.因此,任何只监听的Xvnc进程都是断开连接的会话.

这是一个shell脚本(名为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在过滤时使用AND而不是OR.> -iTCP:5900-5999过滤器,TCP端口编号为5900 – 5999,用于X显示连接.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读