日期:2014-05-17 浏览次数:21693 次
很久没上这个博客了,最近在做虚拟化方面的东西,有个需求是通过windows远程连接Linux桌面,采用的是xrdp。安装和使用xrdp都比较容易,这里就不讲了。
?
在使用xrdp的时候,遇到过一个问题,就是用windows远程桌面工具连接Linux桌面的时候,xrdp的界面出来了,但是键盘输入没有任何反应。经过仔细排查,阅读其源码,还有用tcpdump抓包分析,最后找到了解决方案。下面简单的讲一下问题的原理以及解决方案。
?
========================第一部分? XRDP keymap原理=======================
?
windows的远程桌面连接使用的是RDP协议。在使用其连接xrdp服务端时,会发一个connect-initial的包。里面包含了windows主机的各种信息,例如hostname等。
?
xrdp接收到包之后,会进行解析,其中有个函数 xrdp_sec_in_mcs_data, 其中有几行如下:
?
/* get keylayout */
?s->p = s->data;
?in_uint8s(s, 39);
?in_uint32_le(s, client_info->keylayout);
?s->p = s->data;
?
keylayout对应的是键盘映射,也就是我们说的输入法。这里就是问题发生的原因了,xrdp源码会根据这里取得的client_info->keylayout,通过调用函数get_keymaps? 去读取对应的keymap文件。查看一下xrdp自带的几种keymap文件,如下:
?
[root@localhost xrdp]# ls -lrt /etc/xrdp/km-*
-rw-r--r-- 1 root root 8760 04-19 15:50 /etc/xrdp/km-041d.ini
-rw-r--r-- 1 root root 9169 04-19 15:50 /etc/xrdp/km-0419.ini
-rw-r--r-- 1 root root 8732 04-19 15:50 /etc/xrdp/km-0410.ini
-rw-r--r-- 1 root root 8744 04-19 15:50 /etc/xrdp/km-040c.ini
-rw-r--r-- 1 root root 8756 04-19 15:50 /etc/xrdp/km-0407.ini
-rw-r--r-- 1 root root 8461 05-21 10:20 /etc/xrdp/km-0409.ini
[root@localhost xrdp]#
?
======================第二部分 windows 输入法顺序======================
?
下面介绍一下每种输入法对应的keylayout。
?
Windows系统下,在注册表编辑器(在“开始/运行”对话框中输入“REGEDIT”)中展开,“HKEY_CURRENT_USER\Keyboard Layout\Preload”分支。
?
我的第一项是E0200804,代表的是搜狗输入法。具体的输入法对应的编码如下:
E0200804 紫光输入法*①
E00E0804 微软拼音输入法
E0040804 智能abc输入法
E0050804 区位码输入法
E0010804 全拼输入法
E0100804 五笔输入法
00000409 英文输入法
E0030804 郑码输入法
E0020804 双拼输入法
00000804 中文输入法(简体)-美式键盘
*①注:E0200804这个不一定是紫光的,他可能是谷歌、搜狗、智能陈桥、拼音加加Plus、紫光中的任一种(还可能是与这些输入法输入状态栏一样的其他拼音输入法),这个取决于你系统先安装这几个输入法中的哪一个,那个就是E0200804
?
通过调整HKEY_CURRENT_USER\Keyboard Layout\Preload中的1,2,3就可以调整输入法顺序了。
========================第三部分 解决问题========================
?
通过第二部分,知道了我的windows系统第一输入法是E0200804, 而在Linux系统下Xrdp默认的keymap文件中,是没有“km-E0200804.ini”这个文件的,这就导致xrdp无法读取keymap文件,无法进行键盘映射,从而导致了我们无法再xrdp界面中输入。
?
这样,我们把windows注册表中HKEY_CURRENT_USER\Keyboard Layout\Preload中的1,编辑成00000409, 即英文输入法,这样,xrdp就会去读取“km-0409.ini” keymap文件,然后就可以输入了。
?
需要注意的是,修改注册表之后,记得重启系统。或者是注销一下,让其起作用。
?
?