如何设置重用现有会话的xrdp会话?

我一直在尝试使用xrdp在Precise上设置RDP终端服务器,但一直无法获得可工作的配置。当用户登录时,如果存在该用户的现有会话,则需要连接到该会话,否则启动新会话,并且任何已启动的会话都必须启动LXDE。为使此功能正常工作,我需要对默认配置进行哪些更改?

1在我的XRDP配置中(除非我在桌面会话上运行Unity,远程会话上运行Unity2D),作为用户登录时会自动恢复他们之前的会话。每次连接时,每个用户都会获得一个新的会话吗? - agc93
1我在互联网上找到的最好的解释/解决方案可以在这个链接中找到:http://c-nergy.be/blog/?p=2879。试一试吧,希望这些信息能够帮到你。 - gyest
11个回答

我曾经遇到过同样的问题,但是我找到了一个简单的解决办法。最初,我只是按照标准程序安装了xrdp。
apt-get install xrdp

在那之后,一切都与您的xrdp.ini文件有关,它位于这里:
/etc/xrdp/xrdp.ini

要打开和编辑xrdp的配置文件,请使用以下命令:
sudo nano /etc/xrdp/xrdp.ini

默认情况下,第一个xrdp会话处理脚本如下:
[xrdp1]
name=sesman-vnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1

重要的一行是port=-1,这使得xrdp始终寻找一个空闲端口进行连接。如果你在这里设置了一个固定的端口,xrdp将始终返回并连接到同一个会话。我改变了我的设置,它看起来像这样:
[xrdp1]
name=customsessionname
lib=libvnc.so
username=myusername
password=ask
ip=127.0.0.1
port=5912

就这样,我认为你只需要将port=-1更改为port=5912。我的xrdp始终重新连接到现有会话,并始终使用相同的端口。

2这个解决方案对我来说很有效,但是我应该指出,任何连接到同一台机器的人都会得到相同的会话,即使有其他人在该会话下登录了。 - VeeTheSecond
这个回答真的帮了我很多,谢谢! - Nicholas DiPiazza
11只有在已经存在一个会话的情况下才能起作用。第一次进入时,没有会话,所以无法连接到5912端口。 - stu
4遇到了同样的问题...似乎默认情况下它尝试使用5911端口打开连接(当xrpd正在连接时可以注意到)。因此,我将端口从port=-1更改为port=ask5911。这样5911就会被默认使用,但是在连接时输入用户/密码时可以更改该端口(因此如果出现错误,则无需重新配置任何内容..)。 - Maxym
2这种行为严格依赖于VNC服务器的实现。在CentOS下,我使用的是TigerVNC,它总是加入到现有的会话中或创建一个端口设置为-1的新会话。然而,在Ubuntu下,默认的是TightVNC Server,它没有相同的行为。如果有需要,可以尝试不同的VNC实现。 - Denys S.
有点奇怪,但我发现即使只设置 port=-1,在使用XFCE4时,我最终还是得到了相同的会话。我不确定这是由于XRDP还是XFCE4本身引起的。 - CMCDragonkai
如果两个不同的用户登录到同一个端口,会发生什么情况?他们能同时操作(例如使用鼠标、键盘输入)相同的桌面环境会话吗?XRDP如何处理这种情况? - CMCDragonkai
所以我把它改成了port=ask5910,关闭了会话,然后当我重新进入时,出现了三个输入区域:用户名、密码和端口,而端口的默认值是5910。连接失败了。我尝试了5911和5912,结果一样。所以我输入了-1,创建了一个新的会话。当我断开连接时,我之前运行的程序也终止了(我可以通过数据文件的填充情况来判断)。 - SDsolar
1默认端口是5910,参见https://askubuntu.com/a/527975/592751。 - Peter T.

我想改进现有的答案。最受欢迎的答案是编辑xrdp.ini文件,将端口更改为固定值,而不是使用-1通配符来查找开放的端口。
我尝试过这样做,但第一次连接时出现了错误,所以最终还是切换回了-1的值。然而,问题仍然存在,无法恢复连接,所以我再次查看了ini文件。
对我有效的方法,实际上只是我感到好奇的一个事情:
编辑/etc/xrdp/xrdp.ini[xrdp1]下面,我注意到用户名和密码被设置为ASK。如果你将port=ask,在登录提示中,你将有选择的机会输入用户名和密码来选择一个端口。
不需要安装额外的软件包,我发现最简单的解决方法是设置询问选项,在登录时使用用户名和密码连接第一个会话(如果我没有已经运行的会话),端口为-1。
断开会话后,要恢复现有会话,请始终在默认端口5910上登录,您将恢复现有会话,直到重新启动远程计算机或在注销时结束会话。
总结一下:
  • 编辑xrdp.ini文件
  • 设置port = ask
  • 从远程计算机连接,如果没有现有会话,请在登录时指定端口-1
  • 要恢复会话,请输入默认值5910

对我来说很有效。尽管我以后不会记住5910。 - Vesanto
13我成功地将条目更改为:[xrdp1] . . . port=ask5910。这将默认端口设置为5910,所以你不必像Vesanto说的那样记住它(我也永远不会记得它,Vesanto!),但如果你想在另一个桌面会话上生成新的端口5911,你也可以选择更改它。我在Ubuntu 16.04上进行了测试。 - hoekma
2那是我也找到的最佳解决方案。 - Nacht
在一个刚启动的Rpi3上,我使用端口-1开始了一个新的会话,然后我用另一台电脑使用了端口5910进入 - 它捕捉到了同一个会话。当你在一台电脑上移动东西时,你可以看到它在另一台电脑上发生。 - SDsolar
如果你再次这样做,但是给它一个端口号-1,它将为你创建一个新的会话。 - SDsolar
port=ask 是一个很好的解决方案。无论是从 rdesktop、xfreerdp 还是 Guacamole 进入,都能可靠地恢复会话。谢谢! - PLA
端口为ask5910,并在首次连接时输入-1 - mitchus

问题是xrdp并不总是连接到相同的端口。如果它没有连接上,并且你忘记了端口号,你可以登录一个ssh会话来找出端口号。
netstat -tulpn | grep vnc

你会得到类似以下的东西
tcp        0      0 127.0.0.1:5911          0.0.0.0:*               LISTEN      5365/Xvnc

然后你知道5911是你连接的端口。


对于我的设置(代码=20),我不得不使用grep xrdp来查看我的端口是3389;然而,这种会话类型无法通过端口重新连接(参见https://github.com/neutrinolabs/xrdp/issues/960);只有-1在这里起作用。 - Oliver Zendel

在登录屏幕上,当您首次连接到远程桌面时,应该有一个下拉框,在这里选择"vnc-any",然后输入计算机的IP地址和密码,但保持端口不变,这应该会有所帮助 :)

看起来这个最简单,对我来说很适合。太好了,没有复杂的安装、编译等等。 - josef


修改你的xrdp.ini文件:
sudo vi /etc/xrdp/xrdp.ini

2. 在您的连接规则中更改端口设置 port=ask-1
[xrdp1]
name=sesman-Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=ask-1

3. 重新启动您的xrdp服务
sudo service xrdp restart

当您通过远程桌面登录时,您应该看到以下图片。 enter image description here 1. 初次登录时,您可以看到此端口号。例如:5912: enter image description here 如果您忘记了该端口号,可以使用以下命令进行检查:
netstat -peant | grep 59 | grep Xvnc

2. 你可以通过端口号重新连接上一次的会话。

Ref: http://c-nergy.be/blog/?p=5305


截至Linux Mint/Ubuntu 20,为了解决一般的xrdp问题,我总是发现避免安装预编译包,改为从源代码构建更有用。
并非所有功能都在原始包中启用:例如声音和剪贴板通道必须使用configure开关显式启用,此外键盘映射文件经常过时,像花括号这样的一些键对我来说无法正常工作。当我安装自定义编译版本时,大多数问题神奇地消失了。
您可能希望按照此处此处的说明编译和安装xrdpxorgxrdp(类似于x11rdp的xrdp会话管理器),然后调整/etc/xrdp.ini/etc/xrdp/sesman.ini文件,后者由Xorg(xrdp)使用。我建议在第一个文件中禁用动态通道以降低客户端和服务器的CPU消耗。
为了保险起见,我还使用了客户端的编译版本(Remmina),只是为了确保两者完美适配我的设备。

这可能是个好知识,但与问题完全无关。就我个人而言,我使用ms rdp客户端和Ubuntu 20 xrdp软件包非常顺畅。 - Konstantin Pelepelin
1我认为这个答案与问题相关,因为OP所尝试实现的应该是开箱即用的行为,如果出现问题,很多情况下可能是由于过时/不完整的配置文件或协议,甚至是交叉编译包中的构建错误所致。 - PJ_Finnegan

我在Debian机器上遇到了这个问题。使用X11RDP-o-Matic构建xrdp 0.7软件包。在升级到systemd之前,xrdp会话重新连接正常工作。
查看进程树,我发现会话不再是xrdp-sesman的子进程。原来是在使用systemd时出现了权限问题。谷歌找到了一个修补程序来解决这个问题。
如何确定重新连接是否有效?运行ps axf并查看xrdp-sesman的进程树。X11rdp、xrdp-chansrv、xrdp-sessvc应该都作为子进程运行。如果它们没有运行,xrdp-sesman将无法知道如何重新连接到会话。
以下是正常工作时的情况:

good xrdp session process


这是我所做的。确保已安装tigervnc-server,以便我们可以使用Xvnc。使用默认配置启动VNC会话(我实际上是按照Arch Linux的TigerVNC设置指南进行操作)。然后每次都将配置您的Xrdp使用该VNC会话。还要设置TigerVNC在启动时自动启动或其他方式。这是我的xrdp.ini文件中唯一的VNC部分:
[vnc-any]
name=vnc-any
lib=libvnc.so
ip=localhost
port=5901
username=na
password=YOURPASSWORD
#pamusername=asksame
#pampassword=asksame
#pamsessionmng=127.0.0.1
#delay_ms=2000

如果使用Windows远程桌面客户端连接到Linux会话,我发现保持相同的显示配置和颜色深度将重新连接用户到同一会话。可以通过在启动屏幕左下角选择“显示选项”,然后选择“显示”选项卡来调整这些参数。
如果您不知道现有会话的显示参数是什么,可以启动一个新会话,然后从终端窗口运行ps axf | grep vnc命令。您现有和新的rdp会话的显示参数将显示类似于-geometry 1920x1080 -depth 16的内容。记下这些值,注销您的新会话,然后尝试使用您找到的值进行另一个xrdp登录。