Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.9.1
-
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...