首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libssh2和终端模式编码

libssh2和终端模式编码
EN

Stack Overflow用户
提问于 2018-02-21 00:48:15
回答 2查看 490关注 0票数 1

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还不够熟悉,无法知道该格式是什么,我正在努力寻找能够帮助我弄清楚这一点的文档或代码示例。

有没有人能提供一些提示、洞察力或例子?

EN

回答 2

Stack Overflow用户

发布于 2018-02-21 01:10:11

RFC 4254定义了SSH协议消息。Section 6.2描述了请求PTY的消息:

代码语言:javascript
复制
  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几乎肯定会使用modesmodes_len参数填充“编码的终端模式”字段。

RFC的Section 8描述终端模式的编码:

所有“编码的终端模式”(在pty请求中传递)都被编码成字节流。它的目的是使编码可以在不同的环境中移植。该流由操作码-参数对组成,其中操作码是字节值。操作码1到159只有一个uint32参数。操作码160到255尚未定义,会导致解析停止(它们应该只在任何其他数据之后使用)。该流由操作码TTY_OP_END (0x00)....

终止

票数 1
EN

Stack Overflow用户

发布于 2018-02-22 10:16:44

事实证明,我的问题的答案只是这篇文章的一个细微的变化:

An example of how to specify terminal modes/pty-req string for SSH client

在RFC中有一点值是uint32 (4字节宽)的...along。因此,下面的代码实现了我所需要的功能:

代码语言:javascript
复制
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终止符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48890240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档