JSch-如何使用PortForwarding L从远程服务器捕获流?

时间:2018-07-27 23:55:59

标签: java jsch portforwarding bufferedinputstream

我尝试使用InputStream和Buffer [],也使用BufferedReader,也使用PipedInputStream。对于所有情况,我都为空:

        sessionB = jSch.getSession(username, "localhost", forwardedPort);
        sessionB.connect();

          if(sessionB.isConnected()) {
             System.out.println("Connected host B!");

             channel = (ChannelExec) sessionB.openChannel("exec");   

             br = new BufferedReader(new 
             InputStreamReader(channel.getInputStream())); 
             ((ChannelExec)channel).setCommand("command");
             ((ChannelExec)channel).setErrStream(System.err);

             channel.connect();

             if(channel.isConnected()) {

                System.out.println("Channel is connected!");
            }

             String line;

                    while((line = br.readLine()) != null) {
                    System.out.println(line);
                    }

和控制台输出:

已连接主机A!已连接主机B!频道已连接!

问题:我什么都没打印(System.out.println(line);)

有一种方法可以通过portforwarding从exec通道获取该流?谢谢您的帮助

2 个答案:

答案 0 :(得分:1)

get / setInputStream和get / setOutputStream仅与命令的标准输入/输出有关,与端口转发无关。 端口转发通过两个函数setPortForwardingL和setPortForwardingR完成。

您的代码中应该有类似的内容。

int assinged_port=session.setPortForwardingL(lport, rhost, rport);

与往常一样,关于JSCH的文档很少,但是detailed examplesL forwardingR forwarding

端口转发已在会话上完成,因此我不确定您是否还需要活动连接。但是,如果这样做,则应考虑打开“ shell”连接而不是“ exec”。这样,您就不必为了维护连接而运行无用的命令。

PS:缺少一些代码,因此很难对问题中给出的示例进行准确的说明。

答案 1 :(得分:0)

感谢您的帮助。我使用Pipes解决了这个问题,我分享了我所做的事情:

  PipedInputStream en = new PipedInputStream();
  pin = new PipedOutputStream((PipedInputStream) en);
  BufferedReader br = new BufferedReader(new InputStreamReader((PipedInputStream) 
  channel.getInputStream()));

  channel.connect(5*1000);     


  String received=null;
  while((received=br.readLine())!=null) {
      System.out.println(received);
  }