使用jsch会话和channelexec执行多个命令

tquggr8v  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(2120)

我努力让它工作,但最终得到了在远程unix服务器上执行命令(执行sh脚本)的脚本。我试图执行第二个命令,并不断得到一个错误,要么创建一个新的通道或使用相同的。

try {

            ((ChannelExec) channel).setCommand(command);
            PrintStream out= new PrintStream(channel.getOutputStream());
            InputStream in = channel.getInputStream();

            channel.connect();

            BufferedReader scriptReader= new BufferedReader(new InputStreamReader(in));
            scriptOutput = scriptReader.readLine();

            sb = new StringBuilder();

            while ((scriptOutput = scriptReader.readLine())!= null) {
                sb.append(scriptOutput + "\n");

这是通道execute的第一个片段,可以正常工作。现在,在使用上述inputstream之后立即调用下一个方法片段:

try {

          StringBuilder sb = new StringBuilder();
          command = new_command;
          ((ChannelExec) channel).setCommand(command);

          InputStream in = channel.getInputStream();
          channel.connect();
          BufferedReader scriptReader= new BufferedReader(new InputStreamReader(in));
          scriptOutput = scriptReader.readLine();

            //StringBuilder sb = new StringBuilder();
          for(int c=0; c < consumerList.size(); c++){
           ....

现在返回以下错误:

com.jcraft.jsch.JSchException: channel is not opened.

现在,如果我用相同的会话创建一个新通道,我将从返回的流中得到一个空响应。我在远程shell中测试了该命令,它运行良好:

int counter = 0;
      Channel channelII = session.openChannel("exec");

      try {

          StringBuilder sb = new StringBuilder();
          command = new_command;
          ((ChannelExec) channelII).setCommand(command);

          InputStream in = channelII.getInputStream();
          channelII.connect();
          BufferedReader scriptReader= new BufferedReader(
           new InputStreamReader(in));
          scriptOutput = scriptReader.readLine();

第二个命令如下,我希望能够针对不同的使用者组重复执行该命令:

/usr/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 
    192.xxx.xx.xxx:9092 --describe -group consumergroup1

编辑:
第二命令响应:

TOPIC                          PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  
   LAG        CONSUMER-ID                                       HOST                           
  CLIENT-ID
   output.influxDB    1          94919           2781796         
    2686877    -                                                 -                              
   -
   output.influxDB    0          94919           2781798         
    2686879    -                                                 -                              
   -
   output.influxDB    2          94918           2781795         
    2686877    -                                                 -                              
    -
wnrlj8wa

wnrlj8wa1#

感谢尼古拉斯和马丁的回应。我知道错在哪里了,我想发布一个答案,因为我意识到像这样的小事确实会出现在我们这些“愚蠢”的程序员身上,他们会问一些可笑的问题,招致反对票。第二个命令的输出在第一行返回一个警告/错误响应,由于没有包含以下内容,我看不到,读取下一行是空的。我知道这是愚蠢的,应该在发帖前弄清楚这一点,因为这就是这个网站的重点:发帖的问题超出了别人的知识范围。但既然我天生就知道这一点:
无论如何,请确保包含以下行:

((ChannelExec)channelII).setErrStream(System.err);

也可以通过循环读取流,而不只是通过读取第一行进行测试。

while ((scriptOutput = scriptReader.readLine())!= null) {
                sb.append(scriptOutput + "\n");
          }

我希望这至少可以成为一些教训,如果不是一个解决办法。

相关问题