欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jsch中ChannelShell與ChannelExec的區(qū)別及說明

 更新時(shí)間:2023年07月11日 09:08:27   作者:山鬼謠me  
這篇文章主要介紹了jsch中ChannelShell與ChannelExec的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

環(huán)境

  • jdk:java7
  • 操作系統(tǒng): win7

因?yàn)榭蚣?code>jsch比較老,所以對java版本要求好低。

分析

框架jsch我就不說了,很老的框架,現(xiàn)在也不更新了。

官網(wǎng):http://www.jcraft.com/jsch/

最近在用jsch中的ChannelShell時(shí),遇到問題:

①這個方法會返回命令提示符

很煩;

比如我要執(zhí)行下面幾個命令:

        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();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
        String msg = null;
        while((msg = in.readLine())!=null){
            System.out.println(msg);
        }
        in.close();

得到的結(jié)果是:

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 ~]這樣的命令提示符和輸入的命令都出來,我其實(shí)是不需要這個,我要的只是結(jié)果。

②由于使用BufferedReader的readLine()方法

結(jié)果會產(chǎn)生阻塞。

BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); String msg = null;
while((msg = in.readLine())!=null){//當(dāng)所有的命令都執(zhí)行完畢后,就會產(chǎn)生阻塞
    System.out.println(msg);
}
in.close();

如下圖:

這里寫圖片描述

為什么會這樣呢?

因?yàn)槲覀兘⒌氖?code>shell管道,并且我們又使用readLine方法,當(dāng)命令全部執(zhí)行完畢后,遠(yuǎn)程端并不知道執(zhí)行完畢,還在等待接受數(shù)據(jù),所以呢reandLine就一直阻塞在那里。

即便你換成read方法還是一樣的,因?yàn)?code>shell管道本身就是交互模式的。

要想停止,有兩種方式

①人為的發(fā)送一個exit命令,告訴程序本次交互結(jié)束啦

②使用字節(jié)流中的available方法,來獲取數(shù)據(jù)的總大小,然后循環(huán)去讀。

  • ①代碼:
        InputStream inputStream = channel.getInputStream();//從遠(yuǎn)程端到達(dá)的所有數(shù)據(jù)都能從這個流中讀取到
        OutputStream outputStream = channel.getOutputStream();//寫入該流的所有數(shù)據(jù)都將發(fā)送到遠(yuǎn)程端。
        //使用PrintWriter流的目的就是為了使用println這個方法
        //好處就是不需要每次手動給字符串加\n
        PrintWriter printWriter = new PrintWriter(outputStream);
        String cmd = "ls";
        printWriter.println(cmd);
        String cmd2 = "cd /home/jenkins/workspace/ggservice";
        printWriter.println(cmd2);
        String cmd3 = "ls";
        printWriter.println(cmd3);
        printWriter.println("exit");//加上個就是為了,結(jié)束本次交互
        printWriter.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String msg = null;
        while((msg = in.readLine())!=null){
            System.out.println(msg);
        }
        in.close();
  • ②代碼:
...代碼省略 ...
ChannelShell channel = (ChannelShell) session.openChannel("shell");
channel.connect();
//從遠(yuǎn)程端到達(dá)的所有數(shù)據(jù)都能從這個流中讀取到
InputStream in = channel.getInputStream();
//寫入該流的所有數(shù)據(jù)都將發(fā)送到遠(yuǎn)程端。
OutputStream outputStream = channel.getOutputStream();
byte[] tmp=new byte[1024];
while(true){
  while(in.available()>0){
    int i=in.read(tmp, 0, 1024);
    if(i<0)break;
    System.out.print(new String(tmp, 0, i));
  }
  if(channel.isClosed()){
    if(in.available()>0) continue;
    System.out.println("exit-status: "+channel.getExitStatus());
    break;
  }
}

這樣就不會阻塞啦

最后我就去查ChannelShell和ChannelExec區(qū)別

ChannelShell

對于ChannelShell,以輸入流的形式,提供命令和輸入這些命令,這就像在本地計(jì)算機(jī)上使用交互式shell(它通常用于:交互式使用)

ChannelExec

對于ChannelExec,在調(diào)用connect()方法之前這個命令提供了setCommand()方法,

并且這些命令作為輸入將以輸入流的形式被發(fā)送出去。

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

但是你可以使用普通shell的分隔符(&,&&,|,||,; , \n, 復(fù)合命令)來提供多個命令。

這就像在你本機(jī)上執(zhí)行一個shell腳本一樣(當(dāng)然,如果一個命令本身就是個交互式shell,這樣就像ChannelShell)

明顯:使用命令通道更容易,因?yàn)槟恍枰幚砻钐崾痉?/p>

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

參考鏈接:

http://stackoverflow.com/a/6771417/6952713

http://stackoverflow.com/a/6266308/6952713

相關(guān)文章

  • Java多線程中synchronized的工作原理

    Java多線程中synchronized的工作原理

    這篇文章主要介紹了Java多線程中synchronized的工作原理,本期講解 synchronized 工作的原理以及常見的鎖優(yōu)化機(jī)制,相信大家在看完這篇博文后對 synchronized 工作流程有一定的理解,需要的朋友可以參考下
    2023-07-07
  • Java 利用DeferredResult實(shí)現(xiàn)http輪詢實(shí)時(shí)返回?cái)?shù)據(jù)接口

    Java 利用DeferredResult實(shí)現(xiàn)http輪詢實(shí)時(shí)返回?cái)?shù)據(jù)接口

    這篇文章主要介紹了Java 利用 DeferredResult 實(shí)現(xiàn) http 輪詢實(shí)時(shí)返回?cái)?shù)據(jù)接口,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java遞歸實(shí)現(xiàn)字符串全排列與全組合

    Java遞歸實(shí)現(xiàn)字符串全排列與全組合

    這篇文章主要為大家詳細(xì)介紹了Java遞歸實(shí)現(xiàn)字符串全排列與全組合,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • springboot 如何解決cross跨域請求的問題

    springboot 如何解決cross跨域請求的問題

    這篇文章主要介紹了springboot 如何解決cross跨域請求的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java解決雪花ID在前端精度丟失問題

    java解決雪花ID在前端精度丟失問題

    雪花算法生成的64位Long類型ID在傳遞到前端時(shí)可能會因JavaScript的精度限制導(dǎo)致精度丟失,這篇文章主要介紹了java解決雪花ID在前端精度丟失問題的相關(guān)資料,需要的朋友可以參考下
    2024-11-11
  • 使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能

    使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能

    在現(xiàn)代企業(yè)應(yīng)用開發(fā)中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是一項(xiàng)常見且重要的功能需求,Excel?作為一種廣泛使用的電子表格工具,常常被用來存儲和展示數(shù)據(jù),下面我們來看看如何使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能吧
    2025-01-01
  • mybatis注入Date日期值為null的解決方法

    mybatis注入Date日期值為null的解決方法

    這篇文章主要給大家介紹了關(guān)于mybatis注入Date日期值為null的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 深入解讀Java三大集合之map list set的用法

    深入解讀Java三大集合之map list set的用法

    集合彌補(bǔ)了數(shù)組的缺陷,它比數(shù)組更靈活更實(shí)用,可大大提高軟件的開發(fā)效率,而且不同的集合適用于不同的場合,這篇文章帶你了解Java的三大集合map、list、set用法
    2021-11-11
  • Java實(shí)現(xiàn)UDP多線程在線咨詢

    Java實(shí)現(xiàn)UDP多線程在線咨詢

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)UDP多線程在線咨詢,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • SpringBoot屬性注入的多種方式實(shí)例

    SpringBoot屬性注入的多種方式實(shí)例

    在 SpringBoot中,提供了一種新的屬性注入方式,支持各種java基本數(shù)據(jù)類型及復(fù)雜類型的注入,下面這篇文章主要給大家介紹了關(guān)于SpringBoot屬性注入的多種方式,需要的朋友可以參考下
    2021-10-10

最新評論