问题描述
本地和远程系统都是winxp使用Runtime.exec(),如果执行本地dos命令,dir操作成功,能够全部输出完整dir的命令结果但是如果执行的是远程主机的命令,dir操作仍然成功,但在输出目录信息时,只能输出一部分.个人分析:psexec通过某个socket与远程主机建立连接,并执行相关命令,而程序使用StreamGobbler去读取结果返回信息,但在没读完之前,这个socket就被关闭了,导致只能读到一部分.想请问各位有没有什么办法,在这个socket关闭前,把所有该命令的执行结果都读取出来?-------------------------------------------------------------------------------------------------//process=Runtime.getRuntime().exec("cmd/cdirc:\");//可以正常执行并输出完整C盘的目录信息process=Runtime.getRuntime().exec("cmd/c.\lib\psexec.exe\\192.168.0.123-uabc-p123dirc:\");//最终只能看到部分C盘的目录信息StreamGobblererrorGobbler=newStreamGobbler(process.getErrorStream(),"ERROR",System.err);//psexec程序信息StreamGobbleroutGobbler=newStreamGobbler(process.getInputStream(),"STDOUT",System.out);//执行命令返回结果errorGobbler.start();outGobbler.start();process.getOutputStream().flush();process.getOutputStream().close();process.waitFor();//StreamGobbler.javaimportjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.PrintWriter;publicclassStreamGobblerextendsThread{InputStreamis;Stringtype;OutputStreamos;StreamGobbler(InputStreamis,Stringtype){this(is,type,null);}StreamGobbler(InputStreamis,Stringtype,OutputStreamredirect){this.is=is;this.type=type;this.os=redirect;}publicvoidrun(){try{PrintWriterpw=null;if(os!=null)pw=newPrintWriter(os);InputStreamReaderisr=newInputStreamReader(is);BufferedReaderbr=newBufferedReader(isr);Stringline=null;while((line=br.readLine())!=null){//读到一半的时候,br.readLine就变成nullif(pw!=null)pw.println(line);//System.out.println(type+">"+line);}if(pw!=null)pw.flush();}catch(IOExceptionioe){ioe.printStackTrace();}}}
解决方案
本帖最后由 laibinjiang 于 2009-11-24 16:48:00 编辑
解决方案二:
如果只是执行本地命令:所有程序输出信息都是通过process.getInputStream()获取如果是执行远程命令:psexec输出信息在:process.getErrorStream()命令的返回结果在:process.getInputStream()
解决方案三:
该回复于2009-11-26 08:21:37被版主删除
解决方案四:
楼主的问题解决了吗,我遇到了相似的问题,用psexec调用远程机器的quser获取某个用户的信息时有时能够成功获取,大部分时候inputstream却没有东西,但进程都是正常退出(exitValue()=0),你知道是为什么吗?