You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "dgü (Jira)" <ji...@apache.org> on 2022/10/17 11:58:00 UTC
[jira] [Created] (SSHD-1303) Keeping error streams and input streams separate after ChannelExec#setRedirectErrorStream(true) is called
dgü created SSHD-1303:
-------------------------
Summary: Keeping error streams and input streams separate after ChannelExec#setRedirectErrorStream(true) is called
Key: SSHD-1303
URL: https://issues.apache.org/jira/browse/SSHD-1303
Project: MINA SSHD
Issue Type: Improvement
Affects Versions: 2.9.1
Environment: Java 8
Reporter: dgü
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
{code:java}
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);
}
{code}
Here is an output excerpt:
{quote}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)
{quote}
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...
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@mina.apache.org
For additional commands, e-mail: dev-help@mina.apache.org