Guacamole项目正在使用SSH库创建到服务器的libssh2连接。我们已经确定的一件事是,通过SSH中的VERASE终端模式编码选项传递会很有用,这样远程系统就有更好的机会知道客户端正在发送什么来获取Backspace键。SSH包含一个函数libssh2_channel_request_pty_ex(),该函数允许将有关终端的各种数据传递到libssh2服务器,包括这些编码选项。该函数的文档如下:
https://libssh2.org/libssh2_channel_request_pty_ex.html
modes参数是一个char *,它应该允许您传递各种终端编码操作码和值,但是我在弄清楚如何将操作码和值一起放入char *modes变量以便以有效的方式传递它们时遇到了麻烦。有一个Java SSH客户机具有类似的选项,它似乎使用byte[]对象来完成此任务,但即使是它也没有很好的文档记录。
从libssh2和channel_request_pty()函数的源代码来看,modes中指定的数据看起来只是附加到请求缓冲区中,请求pty (终端的名称和终端的大小)时传递的其他数据就会建立在请求缓冲区中。因此,我希望这个char *modes变量期望这些操作码和值的格式与它们通过网络传递并在另一端读取时SSH服务器所需的格式完全相同,但是我对SSH还不够熟悉,无法知道该格式是什么,我正在努力寻找能够帮助我弄清楚这一点的文档或代码示例。
有没有人能提供一些提示、洞察力或例子?
发布于 2018-02-21 01:10:11
RFC 4254定义了SSH协议消息。Section 6.2描述了请求PTY的消息:
byte SSH_MSG_CHANNEL_REQUEST
uint32 recipient channel
string "pty-req"
boolean want_reply
string TERM environment variable value (e.g., vt100)
uint32 terminal width, characters (e.g., 80)
uint32 terminal height, rows (e.g., 24)
uint32 terminal width, pixels (e.g., 640)
uint32 terminal height, pixels (e.g., 480)
string encoded terminal modes您可以看到,此消息中的字段与libssh2 PTY请求函数的参数排成一列。Libssh2几乎肯定会使用modes和modes_len参数填充“编码的终端模式”字段。
RFC的Section 8描述终端模式的编码:
所有“编码的终端模式”(在pty请求中传递)都被编码成字节流。它的目的是使编码可以在不同的环境中移植。该流由操作码-参数对组成,其中操作码是字节值。操作码1到159只有一个uint32参数。操作码160到255尚未定义,会导致解析停止(它们应该只在任何其他数据之后使用)。该流由操作码TTY_OP_END (0x00)....
终止
发布于 2018-02-22 10:16:44
事实证明,我的问题的答案只是这篇文章的一个细微的变化:
An example of how to specify terminal modes/pty-req string for SSH client
在RFC中有一点值是uint32 (4字节宽)的...along。因此,下面的代码实现了我所需要的功能:
char termModes[] = {
3,
0, 0, 0, 127,
0
};
libssh2_channel_request_pty_ex(channel, type, strlen(type), termModes, sizeof(termModes), termWidth, termHeight, 0, 0)在上面的代码中,3是VERASE的操作码,0, 0, 0, 127是ASCII码的4字节(unit32)值,最后的0是TTY_OP_END终止符。
https://stackoverflow.com/questions/48890240
复制相似问题