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

本文探讨使用JSch连接远程服务器执行命令时遇到的奇怪换行问题。通过分析发现,问题根源在于ChannelShell的伪终端默认尺寸导致命令被截断并换行。最终通过调整伪终端大小解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

最近在使用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将终端设置大一点就行了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值