小弟最近遇到一个头疼万分的问题,修改一个程序,具体功能是先从本地连接到服务器A,然后再从A连接到B,然后再投入命令执行,比如 ls 。
原先都是telnet连接,现在按照要求改成都是ssh2连接,
先连接A,使用的是jsch-0.1.39.jar,     /**
     * ssh connect
      * @param user
     * @param host
     * @param pwd
     * @param command
     */
    public void connectSshByJsch(String user, String host, String pwd,
            String command)
        throws Exception {
        
        jsch = new JSch();
        // user & host
        session = jsch.getSession(user, host);
        // password
        session.setPassword(pwd);
        session.setUserInfo(MyUserInfo);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no"); 
        session.setConfig(config);        session.connect();
        
        channel = session.openChannel("shell");        channel.connect();        // Get input and output stream references
        in = channel.getInputStream();
        // 
        out = new PrintStream(channel.getOutputStream());
    }然后在A上投入命令 ssh username@hostB
接着password
这个时候出现类似控制台的界面。
然后由用户输入命令比如 ls问题出来了,A与B都可以成功连接上,然后等待操作者输入命令,这时报错连接失败,在cmd命令下ssh A再ssh B却不会有这问题。
最奇怪的是连接成功后,在内部投入命令却可以实施,我曾经试过20次“ll”都没断开ireader = new InputStreamReader(in);
int intChar = ireader.read();//这里 结果intChar =-1,表明连接已经丢失但是telnet时候却没有任何问题。
是什么原因呢?inputStream问题?还是jsch的session.connect();channel.connect()问题
望各位高手解答。

解决方案 »

  1.   

    具体功能是先从本地连接到服务器A,然后再从A连接到B,然后再投入命令执行?
    这个为什么要这样呢,可以简化,为什么还要再次连接到B,然后投入命令执行呢
      

  2.   

    楼主,这种问题,仅通过你的描述要找到原因可能比较复杂。如果你怀疑所使用的包有问题,你可以换一下:
    http://www.trilead.com/Download/Trilead_SSH_for_Java/我过去几个项目都用这个,挺好用的。
      

  3.   

    今天仔细研究了一下,发现是jsch 的session.java的run 方法里的这段代码try {
         channel.write(foo, start[0], length[0]);
         String t = new String(foo, start[0], length[0]);
         } catch (Exception e) {
         try {
            channel.disconnect();//这里调用了disconnect方法
                                     //抛出的Exception是PipedInputStream的checkStateForReceive()方法的
                                     //if (readSide != null && !readSide.isAlive()) {
                                     //throw new IOException("Read end dead");
             } catch (Exception ee) {
             }
             break;
    }对于IOException("Read end dead");有什么好的解决方法么,向各位求教
      

  4.   

    补充说明:out = new PrintStream(channel.getOutputStream());
    write方法里out.println(value);
    out.flush();//这里会走到8楼的代码里
      

  5.   

    ireader = new InputStreamReader(in);
     in这个参数 能确定不是空的吗