【JSCH】jsch读取Input流时出现换行问题

  • Post author:
  • Post category:其他




概述

最近在使用jsch来连接远程服务器执行命令,但是出现了一个很奇怪的换行问题

jsch概述:http://www.jcraft.com/jsch/



问题描述



具体请先了解jsch

伪代码:

// 获取流对象
OutputStream out = channelShell.getOutputStream();
InputStream in = channelShell.getInputStream();
// 写入命令
String cmd = "nova list --all-t ";
out.write(cmd.getBytes());
out.flush();
// 读取回显
byte[] tmp = new byte[1024];
while (in.available() > 0) {
	beat = 0;
	int i = in.read(tmp, 0, 1024);
	if (i < 0) break;
	sb.append(new String(tmp, 0, i));
}



问题就来了



回显本来应该是这样的:

[服务器名称 ~]# nova list --all-t 
echo1
echo2
echo3

但是实际获取到的回显是这样的

[服务器名称 ~]# nova list --al
l-t 
echo1
echo2
echo3



很明显问题在于,我们输入的命令自动被换行了



问题原因

本来以为跟输入流或者输出流有关系,然后看了下源码的之后发现,其实跟输入流和输出流没有任何关系,主要问题在于

ChannelShell



1、ChannelShell是可以通过方法

setPty()

来设置一个伪终端的

在这里插入图片描述

2、问题就在于这个伪终端中,这个伪终端是会给定一个默认的长宽高大小的!

在这里插入图片描述

3、问题在于,比如终端的tcol是80,但是我们out.write输入的长度是100的话,此时就会将剩余的20截取然后换到下一行,所以就会出现当前的问题



问题解决

调用方法

setPtySize

将终端设置大一点就行了

在这里插入图片描述



版权声明:本文为dkz97原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。