On Sunday 30 May 2010 10:04:37 Doron Fediuck wrote:
> Hi !
> I'm implementing some basic client functionality using sshd client.
> I found a case where I need to implement something of this concept:
> "gzip /tmp/sample.txt | ssh u...@some.host.com gunzip -c > /tmp/sample.txt"
>
> On my implementation the code (using sshd client) is running an exec channel
> of the gzip command into stdout. Then I should be able to use the stdout
> stream
> and use it to unzip the file locally.
>
> Here's a snip of my implementation:
>
> // Create the GZIP output stream
> ByteArrayOutputStream baosGZipped = new ByteArrayOutputStream ();
> GZIPOutputStream gzOut = new GZIPOutputStream(baosGZipped);
>
> // Open the input file
> FileInputStream src = new FileInputStream(sourceFileName);
>
> byte[] buf = new byte[1024];
> int len;
> while ((len = src.read(buf)) > 0) {
> gzOut.write(buf, 0, len);
> }
> src.close();
>
> // Complete the GZIP file
> gzOut.finish();
> gzOut.flush();
> gzOut.close();
>
> //create channel
> ClientChannel channel = session.createExecChannel("gunzip -c >" +
> destFile);
>
> ByteArrayInputStream in = new
> ByteArrayInputStream(baosGZipped.toByteArray());
> channel.setIn(in);
> ByteArrayOutputStream out = new ByteArrayOutputStream();
> channel.setOut(out);
> ByteArrayOutputStream err = new ByteArrayOutputStream();
> channel.setErr(err);
>
> //open channel
> channel.open();
>
> //wait close
> channel.waitFor(ClientChannel.CLOSED, 0);
>
>
> What I discovered is that this will never end !!!
> The problem is, that there's a pumpInputStream thread in
> (org/apache/sshd/client/channel/ChannelSession.java),
> that will never end until closeFuture.isClosed. Since this does not happen,
> the unzip in the remote host doesn't end,
> and the channel will never close. This prevents the client from a proper pipe
> implementation.
>
> There should be a method to properly end this while-loop thus the remote side
> will be able to finish and close.
> Can you please open a bug for this issue ?
>
> Thanks !
> Doron.
>
Anyone ?