C -LIBSSH2和终端模式编码



鳄梨调味酱项目正在使用libssh2库来创建与服务器的SSH连接。我们确定的一件事是,通过SSH中的Verase终端模式编码选项将很有用,以便远程系统更有机会了解客户端为backspace键发送的内容。libssh2包含一个函数libssh2_channel_request_pty_ex(),该函数允许将有关终端的各种数据传递到SSH服务器,包括这些编码选项。该功能的文档在这里:

https://libssh2.org/libssh2_channel_request_pty_ex.html

modes参数是char *,应该让您传递各种编码Opcodes和values的终端,但是我在弄清楚如何将Opcodes和值放在char *modes变量中时遇到了麻烦,以通过它们来传递它们以有效的方式通过。 有一个Java SSH客户端具有类似的选项,似乎使用byte[]对象来完成此操作,但即使不是很好。

从查看libssh2和 channel_request_pty()函数的源代码,看来modes中指定的数据只是附加到请求缓冲区,该请求缓冲区与请求时通过其他数据构建的其他数据(pty的名称(终端的终端和大小(,所以我希望此char *modes变量期望这些操作编码和值以SSH服务器通过电线并在另一侧读取时所需的确切格式,但是我是不太熟悉SSH,无法知道这种格式是什么,并且正在努力寻找可以帮助我弄清楚的文档或代码示例。

任何人都可以提供提示,洞察力或示例吗?

RFC 4254定义了SSH协议消息。第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几乎可以肯定会填充"编码终端模式"。modesmodes_len参数的字段。

RFC的第8节描述了终端模式的编码:

所有"编码终端模式"(如PTY请求中传递(均已编码进入字节流。旨在使编码可移植不同的环境。该流由opcode-参数对组成其中opcode是一个字节值。Opcodes 1至159有一个UINT32参数。Opcodes 160至255尚未定义,并导致解析要停止(仅在任何其他数据之后才使用它们(。这流由OPCODE TTY_OP_END(0x00(终止。

事实证明,我问题的答案只是这篇文章的略有变化:

如何指定SSH客户端的终端模式/PTY-REQ字符串

...以及RFC中的一点,内容涉及uint32(4个字节宽(。因此,以下是完成我需要的代码:

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的OPODE,0, 0, 0, 127是ASCII backspace代码的4字节(UNIT32(值,tty_op_end terminator的最后0个。

最新更新