Runtime.exec()调用psexec去远程执行dos命令问题

问题描述

本地和远程系统都是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),你知道是为什么吗?

时间: 2024-11-09 06:10:19

Runtime.exec()调用psexec去远程执行dos命令问题的相关文章

php调用com 组件wscript.shell执行dos命令

/php调用com 组件wscript.shell执行dos命令   p('<hr width="100%" noshade /><pre>');   if ($execfunc=='wscript' && IS_WIN && IS_COM) {    $wsh = new COM('WScript.shell');    $exec = $wsh->exec('cmd.exe /c '.$command);    $std

Sun Java Web Server 能让攻击者远程执行任意命令&nbsp;

涉及程序: Solaris and Windows NT 描述: Sun Java Web Server 能让攻击者远程执行任意命令 详细: Sun 的 Java Web 服务器存在多个安全问题,允许攻击者远程以 web 服务器权限执行命令. 它的 Web 管理模块监听 9090 端口,通过 http 处理管理命令."com.sun.server.http.pagecompile.jsp92.JspServlet" servlet用来编译并执行JSP文件的,通过增加"/ser

unix-Solaris 10 写一个脚本,在atc用户下,调用该脚本,执行poweroff命令

问题描述 Solaris 10 写一个脚本,在atc用户下,调用该脚本,执行poweroff命令 Solaris 10 写一个脚本,在atc用户下,调用该脚本,执行poweroff命令 解决方案 实现一个脚本,然后atc用户执行 解决方案二: 实现一个脚本,然后atc用户执行

在C#中用什么方法执行DOS命令?

问题描述 在C#中用什么方法执行DOS命令,那位仁兄告诉下啊 解决方案 解决方案二:processs.start()解决方案三:添加一个Process实例(如myProcess),然后设置它的filename为cmd.exe,请注意路径.再myProcess.Start()解决方案四:usingSystem;usingSystem.Text;usingSystem.IO;usingSystem.Diagnostics;classProgram{staticvoidMain(string[]arg

Allaire JRUN 2.3远程执行任意命令漏洞

JRun 涉及程序: JRUN 描述: Allaire JRUN 2.3远程执行任意命令漏洞 详细: Allaire 的 JRUN 服务器 2.3上存在一个安全漏洞,允许远程用户把在 WEB 服务器上的任意文件作为JSP代码编译/执行. 如果URL请求的目标文件使用了前缀"/servlet/",则JSP解释执行功能被激活.这时在用户请求的目标文件路径中使用"../",就有可能访问到 WEB 服务器上根目录以外的文件.在目标主机上利用该漏洞请求用户输入产生的一个文件,

C#中利用process类调用外部程序以及执行dos命令

程序|执行 c#中的Process类可方便的调用外部程序,所以我们可以通过调用cmd.exe程序 加入参数 "/c " + 要执行的命令来执行一个dos命令(/c代表执行参数指定的命令后关闭cmd.exe /k参数则不关闭cmd.exe)  1         private string RunCmd(string command)     2         { 3             //實例一個Process類,啟動一個獨立進程 4             Process

Python中调用PowerShell、远程执行bat文件实例_PowerShell

python调用本地powershell方法 1.现在准备一个简陋的powershell脚本,功能是测试一个IP列表哪些可以ping通: 复制代码 代码如下: function test_ping($iplist) {     foreach ($myip in $iplist)     {         $strQuery = "select * from win32_pingstatus where address = '$myip'"         # 利用 Get-WmiO

JAVA中如何执行DOS命令

  下面是一种比较典型的程序模式: ... Process process = Runtime.getRuntime().exec(".p.exe"); process.waitfor( ); ... 在上面的程序中,第一行的".p.exe"是要执行的程序 名,Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指 定的可执行程序,并返回与该子进程对应的Process对象实例.通过

VC执行DOS命令时如何感知异常?

问题描述 比如用VC执行del命令,当文件正在被使用时是肯定删不掉的,我要在程序中捕获这一"删除失败异常",怎么办? 解决方案 解决方案二:ding!!!!!!!!!