概述
最近在使用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 版权协议,转载请附上原文出处链接和本声明。