java channelexec_jsch中ChannelShell与ChannelExec区别

环境

jdk:java7

操作系统: win7

因为框架jsch比较老,所以对java版本要求好低。

分析

框架jsch我就不说了,很老的框架,现在也不更新了。

官网:http://www.jcraft.com/jsch/

最近在用jsch中的ChannelShell时,遇到问题:

①这个方法会返回命令提示符,很烦;

比如我要执行下面几个命令:

ChannelShell channel = (ChannelShell) session.openChannel("shell");

channel.connect();

InputStream inputStream = channel.getInputStream();

OutputStream outputStream = channel.getOutputStream();

String cmd = "ls \n\r";

outputStream.write(cmd.getBytes());

String cmd2 = "cd /home/jenkins/workspace/ggservice \n\r";

outputStream.write(cmd2.getBytes());

String cmd3 = "pwd \n\r";

outputStream.write(cmd3.getBytes());

outputStream.flush();

得到的结果是:

Last login: Fri Apr 28 15:07:22 2017 from 192.168.52.63

ls

cd /home/jenkins/workspace/ggservice

pwd

[root@master01 ~]# ls

bintray-sbt-rpm.repo tables_mysql_innodb.sql

[root@master01 ~]#

[root@master01 ~]# cd /home/jenkins/workspace/ggservice

[root@master01 ggservice]#

[root@master01 ggservice]# pwd

/home/jenkins/workspace/ggservice

[root@master01 ggservice]#

可以看出,连[root@master01 ~]这样的命令提示符和输入的命令都出来,我其实是不需要这个,我要的只是结果。

②就是如果此时使用BufferedReader中的readLine()方法会一直等待因为被阻塞。

BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); String msg = null;

while((msg = in.readLine())!=null){

System.out.println(msg);

}

in.close();

当所有的命令都执行完毕后,因为使用readLine()方法被阻塞啦!

最后我就去查ChannelShell和ChannelExec区别

ChannelShell

对于ChannelShell,以输入流的形式,提供命令和输入这些命令,这就像在本地计算机上使用交互式shell

(它通常用于:交互式使用)

ChannelExec

对于ChannelExec,在调用connect()方法之前这个命令提供了setCommand()方法,

并且这些命令作为输入将以输入流的形式被发送出去。

(通常,你只能有调用setCommand()方法一次,多次调用只有最后一次生效),

但是你可以使用普通shell的分隔符(&,&&,|,||,; , \n, 复合命令)来提供多个命令。

这就像在你本机上执行一个shell脚本一样(当然,如果一个命令本身就是个交互式shell,这样就像ChannelShell)

明显:使用命令通道更容易,因为您不需要处理命令提示符。

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值