Looks like a timing issue

getstuff(...) immediately checks if any output is available.  This  
check likely occurs before the actual output is availabe.

To verify this is your problem, put a Thread.sleep(1000) statement  
before the call to getsuff(...).  This is not a fix though; do not  
rely on it for your application's correctness.

A permanent fix depends mainly on what you are trying to accomplish.   
Unless you intend on providing interaction with the user,  I'd  
recommend using an exec session for each command instead of a shell  
session.

-Keith

Sent from my iPod

On Jan 14, 2011, at 9:32 AM, William Bathurst <[email protected]>  
wrote:

> I begged and borrowed some code and tried to make somewhere I can  
> send a command
> to a server and then retrieve the results. The problem I am having  
> is that the
> results is always delayed. Note I put >>><<< to separate results:
>
> Sent carriage return, retrieved:
> [joe@flos] ~ #
>
> Sent "who" command, retrieved empty line and prompt:
>
> [joe@flos] ~ #
>
> Sent carriage return, retrieved results I expected from previous  
> command:
> who
> bob     ttyS0        Dec 23 20:44
> joe     pts/0        Jan 14 01:57 (192.168.1.87)
> joe     pts/1        Jan 14 07:16 (192.168.1.100)
> [joe@flos] ~ #
>
> This seems like real odd behavior to me. For example, if I send a  
> command like
> "who", I will get the command prompt. But if I send an empty command  
> (carriage
> return) afterward then I will get the "who" command results.
>
> I first do a write to the channel outputstream:
>
>            System.out.println 
> (">>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<");
>            stdOut.write("\n".getBytes());
>            results = getstuff(in,buffer,bos,channel);
>            System.out.println(results);
>            stdOut.flush(); results = "";
>
> I have a method that processes the results via means I saw in  
> various postings:
>
>               while (in.available() > 0) {
>                    int count = in.read(buffer, 0,  
> DEFAULT_BUFFER_SIZE);
>                    if (count >= 0) {
>                        bos.write(buffer, 0, count);
>                    } else {
>                        break;
>                    }
>                }
>
> The buffer is passed back. It makes me wonder, what is in the channel
> OutputStream before I start sending commands. How do I clear the  
> buffer, I
> assumed stdOut.flush() should do the trick. How do I allign the  
> InputStream such
> that it has the results of the completed command sent to the  
> OutputStream
>
> A more complete code snippet follows
>
>      try {
>            session = jsch.getSession(username, hostname, port);
>            session.setPassword(password);
>            java.util.Hashtable config = new java.util.Hashtable();
>            config.put("StrictHostKeyChecking", "no");
>            session.setConfig(config);
>            session.setDaemonThread(true);
>            session.connect(3 * 1000); // making a connection with  
> timeout.
>            channel = (ChannelShell)session.openChannel("shell");
>            channel.setPtyType("vt102");
>
>            Hashtable env = new Hashtable();
>            channel.setEnv(env);
>
>            channel.connect(5 * 1000);
>            OutputStream stdOut = channel.getOutputStream();
>            InputStream in = channel.getInputStream();
>
>            // read command output
>            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
>            ByteArrayOutputStream bos = new ByteArrayOutputStream();
>            String results = "";
>
>
>            System.out.println 
> (">>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<");
>            stdOut.write("\n".getBytes());
>            results = getstuff(in,buffer,bos,channel);
>            System.out.println(results);
>            stdOut.flush(); results = "";
>
>            System.out.println(">>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<");
>            stdOut.write("who \n".getBytes());
>            results = getstuff(in,buffer,bos,channel);
>            System.out.println(results);
>            stdOut.flush(); results = "";
>
>            System.out.println 
> (">>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<");
>            stdOut.write("\n".getBytes());
>            results = getstuff(in,buffer,bos,channel);
>            System.out.println(results);
>            stdOut.flush();
>
>            channel.disconnect();
>        } catch (JSchException jse) {
>            // TODO: Add catch code
>            jse.printStackTrace();
>        } catch (IOException ioe) {
>
>            ioe.printStackTrace();
>        }
>    }
>
>    public String getstuff(InputStream in,byte[] buffer,  
> ByteArrayOutputStream
> bos, ChannelShell channel){
>      int exitStatus = 0;
>      try {
>            final long endTime = System.currentTimeMillis() + TIMEOUT;
>            while (System.currentTimeMillis() < endTime) {
>                while (in.available() > 0) {
>                    int count = in.read(buffer, 0,  
> DEFAULT_BUFFER_SIZE);
>                    if (count >= 0) {
>                        bos.write(buffer, 0, count);
>                    } else {
>                        break;
>                    }
>                }
>                if (channel.isClosed()) {
>                    exitStatus = channel.getExitStatus();
>                    break;
>                }
>                try {
>                    Thread.sleep(POLL_TIMEOUT);
>                } catch (InterruptedException e) {
>                    //("Ignoring interrupt.");
>                }
>            }
>        } catch (IOException ioe) {
>            // TODO: Add catch code
>            ioe.printStackTrace();
>        }
>        String stuff = bos.toString();
>        bos.reset();
>        return stuff;
>    }
>
> }
>
>
> --- 
> --- 
> --- 
> ---------------------------------------------------------------------
> Protect Your Site and Customers from Malware Attacks
> Learn about various malware tactics and how to avoid them. Understand
> malware threats, the impact they can have on your business, and how  
> you
> can protect your company and customers by using code signing.
> http://p.sf.net/sfu/oracle-sfdevnl
> _______________________________________________
> JSch-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/jsch-users

------------------------------------------------------------------------------
Protect Your Site and Customers from Malware Attacks
Learn about various malware tactics and how to avoid them. Understand 
malware threats, the impact they can have on your business, and how you 
can protect your company and customers by using code signing.
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
JSch-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jsch-users

Reply via email to