Uploaded image for project: 'MINA SSHD'
  1. MINA SSHD
  2. SSHD-1303

Keeping error streams and input streams separate after ChannelExec#setRedirectErrorStream(true) is called

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 2.9.1
    • 2.9.2
    • None
    • Java 8

    Description

      Hello!

      As I understand, if I call ChannelExec#setRedirectErrorStream(true), then ChannelExec#getInvertedErr() and ChannelExec#getInvertedOut() return the same input stream.

      If I redirect error stream and read the error stream before the input stream, then the error stream returns the message even if there is an error or not, which is not expected.

      Here is the test case

                  BufferedReader input;
                  String line;
                  
                  //process.getErrorStream() gets its value from ChannelExec#getInvertedErr()
                  System.out.println("getErrorStream: " + process.getErrorStream());
                  input = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                  while ((line = input.readLine()) != null) {
                      System.out.println(line);
                  }
      
                  //process.getInputStream() gets its value from ChannelExec#getInvertedOut()
                  System.out.println("getInputStream: " + process.getInputStream());
                  input = new BufferedReader(new InputStreamReader(process.getInputStream()));
                  while ((line = input.readLine()) != null) {
                      System.out.println(line);
                  }
      

      Here is an output excerpt:

      getErrorStream: org.apache.sshd.common.channel.ChannelPipedInputStream@bd8db5a
      total 0
      drwx------. 3 root root 17 Oct 17 10:31 systemd-private-c3ce924f90c24e4a86f637831f434fe3-chronyd.service-DwM2fR
      drwx------. 3 root root 17 Oct 14 13:22 systemd-private-e0701fd845894b6087a236a976c00b35-chronyd.service-2z3OOv
      getInputStream: org.apache.sshd.common.channel.ChannelPipedInputStream@bd8db5a
      Exception in thread "main" java.io.IOException: Pipe closed after 0 cycles
      at org.apache.sshd.common.channel.ChannelPipedInputStream.read(ChannelPipedInputStream.java:126)
      at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
      at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
      at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
      at java.io.InputStreamReader.read(InputStreamReader.java:184)
      at java.io.BufferedReader.fill(BufferedReader.java:161)
      at java.io.BufferedReader.readLine(BufferedReader.java:324)
      at java.io.BufferedReader.readLine(BufferedReader.java:389)

      As seen above, ls command output comes from the error stream even if the error redirection is set to true and command runs successfully.

      The second problem is an exception problem. It is independent from the error stream redirection. I have openned SSHD-1302 for this.

      Requests:

      • Is it possible to make ChannelExec#getInvertedErr() and ChannelExec#getInvertedOut() two separate input streams ?
      • Is it possible to rely on java.lang.ProcessBuilder, so that the stream returned from error stream will always be a null input stream as below from Java 8 source code:
        static class NullInputStream extends InputStream {
        static final NullInputStream INSTANCE = new NullInputStream();
        private NullInputStream() {}
        public int read() { return -1; }
        public int available() { return 0; }

        }

      Thanks in advance...

      Attachments

        Activity

          People

            twolf Thomas Wolf
            dgun dgü
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0h
                0h
                Logged:
                Time Spent - 50m
                50m