我这里有一台运行xrdp的Xubuntu 14.04服务器让几个用户连接到它.
现在有一个问题:通过RDP从 Windows瘦客户端访问此服务器的用户通常使用“X”来关闭RDP会话(因此断开但不注销).
现在有一个问题:通过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显示连接.)