如何为SSH客户端指定终端模式/ pty-req字符串的示例

时间:2014-07-08 03:20:45

标签: java ssh

我需要指定一些终端模式,特别是TTY_OP_ISPEED/TTY_OP_OSPEED客户端中的SSH。然而,对于我的生活,我无法弄清楚正确的格式。

阅读http://www.ietf.org/proceedings/56/I-D/draft-ietf-secsh-connect-16.txt告诉我它们被编码为字节流,但绝对没有迹象表明如何

我猜我需要格式化我的字符串,类似于:

byte[] terminalModes = "TTY_OP_ISPEED=36000;TTY_OP_OSPEED=36000;".getBytes();

或:

byte[] terminalModes = "128 36000 129 36000".getBytes();

我们的程序正在使用ssh客户端实现de.mud.jta.plugin / ch.ethz.ssh2但是我不认为这很重要,因为我可以看到他们只是按原样使用byte []。 (我正在使用http://www.ganymed.ethz.ch/ssh2/javadoc/ch/ethz/ssh2/Session.html#requestPTY(java.lang.String,int,int,int,int,byte [])方法传递termnial模式)

任何有效的pty-req字符串示例都将受到赞赏。

提前致谢!

1 个答案:

答案 0 :(得分:3)

格式在RFC 4254第8节的开头指定,这是您正在阅读的草稿的最终版本:

All 'encoded terminal modes' (as passed in a pty request) are encoded
into a byte stream.  It is intended that the coding be portable
across different environments.  The stream consists of opcode-
argument pairs wherein the opcode is a byte value.  Opcodes 1 to 159
have a single uint32 argument.  Opcodes 160 to 255 are not yet
defined, and cause parsing to stop (they should only be used after
any other data).  The stream is terminated by opcode TTY_OP_END
(0x00).

因此,如果您想指定输入和输出速度为36000,则将其编码为:

byte[] terminalModes = {
    128,              // TTY_OP_ISPEED
    0, 0, 0x8c, 0xa0, // 36000 = 00008ca0
    129,              // TTY_OP_OSPEED
    0, 0, 0x8c, 0xa0, // 36000 again
    0,                // TTY_OP_END
};

(在Java中可能有一种更流畅的方式,但我不知道它。)

请注意,并非所有服务器都会支持此功能。大多数基于UNIX的操作系统仅支持PTY的标准波特率(例如,14400,288800,38400,57600,115200),并且大多数操作系统甚至不使用它。