现在有一个问题:通过RDP从 Windows瘦客户端访问此服务器的用户通常使用“X”来关闭RDP会话(因此断开但不注销).
我知道sesman.ini中有一些选项来处理这种行为,但正如联机帮助页所说,这些选项目前被忽略(并且已经存在多年).
可以解决我的问题的选项是:
Killdisconnected
disconnectedTimeLimit
IdleTimeLimit
现在我需要破解处理断开连接的会话的东西.我的第一个想法是杀死所有断开连接的远程用户 – 但我不知道如何获取会话断开的信息.
那么……我如何找到断开连接的会话?
或者:是否已经有任何首选方式来处理断开连接的会话?
解决方法
$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显示连接.)
原文地址:https://www.jb51.cc/linux/397680.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。