Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C libssh2与终端模式编码_C_Ssh_Libssh2 - Fatal编程技术网

C libssh2与终端模式编码

C libssh2与终端模式编码,c,ssh,libssh2,C,Ssh,Libssh2,鳄梨酱项目使用libssh2库创建到服务器的SSH连接。我们已经确定的一件事是,在SSH中传递VERASE终端模式编码选项会很有用,这样远程系统就有更好的机会知道客户端为退格键发送了什么。libssh2包含一个函数,libssh2\u channel\u request\u pty\u ex(),该函数允许将有关终端的各种数据传递到SSH服务器,包括这些编码选项。函数的文档如下所示: modes参数是一个char*参数,它应该允许您传递各种终端编码操作码和值,但是我很难弄清楚如何将操作码和值一

鳄梨酱项目使用libssh2库创建到服务器的SSH连接。我们已经确定的一件事是,在SSH中传递VERASE终端模式编码选项会很有用,这样远程系统就有更好的机会知道客户端为退格键发送了什么。libssh2包含一个函数,
libssh2\u channel\u request\u pty\u ex()
,该函数允许将有关终端的各种数据传递到SSH服务器,包括这些编码选项。函数的文档如下所示:

modes
参数是一个
char*
参数,它应该允许您传递各种终端编码操作码和值,但是我很难弄清楚如何将操作码和值一起放入
char*modes
变量中,以便以有效的方式传递它们。 有一个JavaSSH客户机,它有类似的选项,似乎使用
byte[]
对象来实现这一点,但即使是它也没有很好的文档记录

从libssh2的源代码和
channel_request_pty()
函数来看,在
模式中指定的数据似乎只是附加到请求缓冲区中,该缓冲区与请求pty时传递的其他数据(终端名称和终端大小)一起建立,因此,我希望这个
char*modes
变量期望这些操作码和值的格式与SSH服务器在通过线路传递并在另一端读取时所需的格式完全相同,但我对SSH还不太熟悉,不知道该格式是什么,我正在努力寻找帮助我解决这个问题的文档或代码示例

有人能提供提示、见解或示例吗?

定义SSH协议消息。描述请求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几乎肯定会从
模式
模式
参数填充“编码终端模式”字段

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

所有“编码终端模式”(在pty请求中传递)均已编码 转换为字节流。其目的是编码可以跨多个应用程序进行移植 不同的环境。该流由操作码-参数对组成 其中,操作码是字节值。操作码1至159具有单个 uint32参数。操作码160到255尚未定义,原因是 停止解析(它们只应在任何其他数据之后使用)。这个 流由操作码TTY_OP_END(0x00)终止


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

…以及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的操作码,
0,0,0,127
是ASCII退格码的4字节(unit32)值,最后的0是TTY_OP_结束符。

所以,我想我理解其中的一部分-我想我的问题可能更基本一点:在C中,机制是什么,将操作码和值(例如,对于VERASE,操作码为3,值为^?)放在一起,并将它们放入char指针数组以传递给libssh2?