2013-05-08 169 views
0

我使用下面的代码来获得使用JSCH库命令的输出,bashrc中回声jsch输出流来

public SSHOutputBean executeCommand(String cmd, int timeOut) { 

      SSHOutputBean outputBean=new SSHOutputBean(); 
      Channel ch=null; 
     try { 
      ch= this.session.openChannel("exec"); 

      ChannelExec chExec= ((ChannelExec) ch); 
      chExec.setErrStream(System.err); 
      chExec.setInputStream(null); 
      chExec.setCommand("reset;"+cmd); 
      chExec.connect(); 
      outputBean.setInputStream(chExec.getInputStream()); 
      BufferedReader brInput = new BufferedReader(new InputStreamReader(outputBean.getInputStream())); 
      outputBean.setErrorStream(chExec.getErrStream()); 
      BufferedReader brError = new BufferedReader(new InputStreamReader(outputBean.getErrorStream())); 
      while (true) { 
       try { 

        String result = brInput.readLine(); 
        if (result == null) 
         break; 
        outputBean.getOutput().append(result+"\n"); 

       } catch (Exception ex) { 
         ex.printStackTrace(); 
         break; 
       } 
      } 

      while (true) { 
       try { 

        String result = brError.readLine(); 
        if (result == null) 
         break; 
        outputBean.getError().append(result+"\n"); 

       } catch (Exception ex) { 
         ex.printStackTrace(); 
         break; 
       } 
      } 

if (chExec.isClosed()) { 

       outputBean.setExitStatus(chExec.getExitStatus()); 

      } 
      chExec.disconnect(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSchException e){ 

      e.printStackTrace(); 
     } 
     finally 
     { 
      if(ch!=null) 
       ch.disconnect(); 
     } 

    return outputBean; 
} 

的问题是,如果客户端上的.bashrc文件打印的东西在控制台上,然后每次我打开一个ChannelExec并运行一个命令;在命令执行时给出的输出包含命令的输出以及bashrc输出。我只想输出命令而不是打印bashrc。

例如,

如果我已经把下面的代码在.bashrc文件

回声 “欢迎用户”

和如果我运行命令使用jsch,

SSHOutputBean sshOutputBean = ssh.executeCommand( “正常运行时间”);

然后输出是,

欢迎用户(.bashrc中输出)

13时15分10秒达2天1:53,8个用户,平均负载:0.14,0.06, 0.06(实际命令输出)

但我想输出是,

十三点15分10秒达2天1:53,8个用户,平均负载:0.14,0.06,0.06(实际指令输出)

请帮忙!

回答

0

我假设您不能简单地将.bashrc更改为安静。如果您想要隔离由您的命令产生的输出,并在此之前忽略任何内容,则Exec频道可能不是您最好的选择。当你运行命令时,你输出的流将包含所有的输出。

你可以尝试使用shell代替。你可以让它连接并让你的流读取所有的初始输出(也就是.bashrc文件中的“欢迎用户”或其他输出)。然后刷新流,然后执行你的命令并读取流,只看到命令本身的输出。

或者,您可以使用channelExec来解决问题。使用channel.setEnv(name,value)设置PS1变量以包含一些分隔字符串。例如:

channel.setEnv("PS1","Command Starts Here::") 

然后,您可以分析你在你的提示输出上的界定串“命令从这里开始::”

+0

嘿感谢很多关于这样一个清晰的答案。我也尝试过使用shell,它会打印一次.bashrc输出,但它还会打印每个命令的 [username @ hostname] $命令 。 解决方法非常好,但是我已经拥有了另一个在执行命令之前回显一个字符串的地方,然后使用此字符串作为分隔符。我正在寻找一些具体的解决方案,我们可以使用一些JSCH选项来执行所需的操作。 非常感谢。 – 2013-05-09 07:51:48

+0

[username @ hostname] $听起来像一个提示。这些由PS1,PS2,PS3和PS4环境变量控制。您可以使用setEnv删除您的频道提示(使用exec或shell)。回声是一个很好的简单工作。我不认为你会找到内置的东西来解决这个问题,因为这个问题的本质 - 通道有一个输出流,你的服务器正在向它发送输出。你可以在服务器端静默它,或者在客户端进行解析/过滤。也许PaŭloEbermann会用一些绝密的jsch功能来加入:) – Damienknight 2013-05-09 15:04:45

+0

非常感谢回复。是的,似乎没有其他选项可以回显,然后在服务器端执行解析器。 – 2013-05-13 06:43:10