关于在java应用中调用ssh的一个问题

由于我们的项目要用到ssh通信,所以需要在程序中调用ssh命令.
我采用的方式如下:
try {
String command = "ssh -2 -N -f -L 5000:122.204.142.54:8889 administrator@122.204.142.54 - i c:\axrsa" ;
// 注意:c:\axrsa为一个秘钥文件
Runtime.getRuntime().exec(command);
}
catch (IOException e)
{
e.printStackTrace();
}

可是出现的问题是,老是连接不上去,但如果我把command行命令在运行里面手动输入,却可以成功.但是却关闭不了dos窗口.须强行关闭.
这个问题困扰了我好几天了,请大家帮我看看啊.我初步怀疑是不是exec返回的子进程的输出缓冲区太小的原因.因为如果连接成功的话,ssh会返回很多信息.

[b]问题补充:[/b]
谢谢layer555 的热心回答.
但是我还是没有解决问题,我测试如下代码:

[img]/upload/attachment/108471/9a175e66-162b-395b-8288-56b7e627a5e0.jpg[/img]

然后一运行,发现程序结束不了.经调试发现,执行到如下语句就出问题了.
while ((line = error.readLine()) != null) {

                errorMessage.append(line); 
            } 

请问这是为什么? 谢谢大家

要不你再试试另一种写法吧,把两个流封装到线程中,单独启动,然后主线程使用process.waitFor()来等待程序结束。具体例子见 http://search.iteye.com/blog/253257

一般有输出的调用必须返回一个引用,然后及时的导出它的输出流,否则会发生阻塞。 Process process = Runtime.getRuntime().exec(command);
try {
BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream()));
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuffer errorMessage = new StringBuffer();
StringBuffer infoMessage = new StringBuffer();
String line;
while ((line = error.readLine()) != null) {
logger.warn("Standard err: " + line);
errorMessage.append(line);
}

        while ((line = input.readLine()) != null) {
            logger.info("Standard out: " + line);
            infoMessage.append(line);
        }
        rets[0] = errorMessage.toString();
        rets[1] = infoMessage.toString();
        return rets;
    } catch (Throwable e) {
        throw new IOException(e);
    }

你可以给你的程序添加上读取命令行输出的流,应该就可以解决问题了。

  学习了

这个估计是内存有限吧:StringBuffer类都是引用类型,你将结果全放进去了,内存能有那么大吗?这个跟你测试的流有多大有关