【问题标题】:execute multiple command with jsch session and channelexec使用 jsch session 和 channelexec 执行多个命令
【发布时间】:2019-03-02 12:47:41
【问题描述】:

我努力让它工作,但最终让脚本在远程 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");

这是通道执行的第一个 sn-p 工作正常。现在下一个方法 sn-p 在消费完上述输入流后立即被调用:

      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    -                                                 -                              
    -

【问题讨论】:

  • 您尝试远程执行的 2 个命令是什么?
  • 您可以在一行中设置两个命令,以\n 分隔。例如:command = cd /home \npwd \n
  • 第一个命令是什么?它是否与后一个命令有关?您是否尝试读取错误流?
  • 我需要第一个命令的输出来运行第二个命令:第一个命令 - kafka/bin/kafka-consumer-groups.sh --bootstrap-server 192.xxx.xx.xxx:9092 - -list --> 这将为我提供消费者组列表,然后我可以将其单独用于下一个命令 - kafka/bin/kafka-consumer-groups.sh --bootstrap-server 192.xxx.xxxxx:9092 - -describe -group ????
  • 好的,但是即使没有第一个命令,第二个命令 也可以使用,对吗? (你认识这个小组吗)

标签: java unix apache-kafka jsch


【解决方案1】:

感谢 Nicholas 和 Martin 的回复。我弄清楚出了什么问题并想发布一个答案,因为我确实意识到像这样的小事情确实会出现在我们这些“愚蠢”的程序员身上,他们提出的荒谬问题会招致反对票。第二个命令的输出在第一行返回警告/错误响应,并且不包括以下内容,我没有看到,并且读取下一行是空的。我知道这很愚蠢,应该在发布之前弄清楚这一点,因为这就是本网站的重点:发布超出他人知识范围的问题。但既然我天生就应该知道这一点:

无论如何,请确保包含以下行:

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

并且还通过循环读取流,而不仅仅是通过读取第一行进行测试。

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

我希望这至少能给一些人上一课,如果不是解决方案的话。

【讨论】:

  • 不过,如前所述,使用现有的 Kafka API 获取这些信息通常更容易
  • setErrStream 仅在 Cisco 具有非常小的错误输出缓冲区时才有意义。虽然确实,一般来说,您需要阅读错误和标准输出。请参阅我对stackoverflow.com/q/37528319/850848 的回答——尽管即使在这种情况下,您也不应该从readLine 获得null,而是应该挂起。
  • @NicholasK 怎么样?您可以继续发表您的评论作为答案,我会接受。
  • @vbNewbie :我想我应该更清楚。支持我的另一个答案。我的意思是开玩笑,但不会有任何伤害;)也请清楚地了解您的问题,因此只想发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2012-08-31
  • 2015-10-18
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
相关资源
最近更新 更多