psexec在JVM中无法获取交互信息,高手进来看看。

桃园闲人 2012-11-14 09:50:06
psexec介绍见:http://baike.baidu.com/view/555225.htm

运行环境win2003,JDK1.6.

在DOS下运行命令:
cmd /c psexec \\10.67.192.212 -u china\liuxhwfe -p xxxxxx cmd /c dir D:\

注:10.67.192.212这是本机IP,psexec已添加至环境变量中。即通过psexec通过指定的用户远程访问本机并执行 dir D:\命令。在控制台会得到D:\下的目录信息。

以上效果都是按照我的预定计划想要的结果,通过程序真确实现。但是现在使用java来运行该命令的时候就无法获取到D:\下的信息了。代码如下:

public static void main(String[] args) throws Exception {
String cmd = "cmd /c psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c dir D:\\";
Process pro = Runtime.getRuntime().exec(cmd);
BufferedReader read = new BufferedReader(new InputStreamReader(pro.getInputStream(),"GBK"));
String line = null;
while((line = read.readLine()) != null){
System.out.println(line);
}
pro.destroy();
}


有没有人用过pstools工具?psexec问什么会出现这种情况?不知道是JVM的问题还是pstools的问题,如果不使用psexec命令,直接运行cmd /c dir D:\ 这个命令是可以的,问题就出在psexec这个命令上,它是通过远程执行命令,并将交互信息返回给当前控制台中,所以在DOS界面中可以看到这些交互信息的,但是JVM为何就获取不到呢?程序在while循环read.readLine()这里执行一次,即读取到第一行后就不向下执行,一直卡在这里。
...全文
422 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
桃园闲人 2012-11-22
  • 打赏
  • 举报
回复
ldh911 这位老兄抱歉,结贴的时候看错了,没把分给你,实在抱歉哈!
桃园闲人 2012-11-22
  • 打赏
  • 举报
回复
总结一下经验,然后结贴!
String cmd = "cmd /c start psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c dir D:\\";
1.下面DOS命令可以执行,会弹出DOS界面,命令中的输出信息任然无法在java程序中获取,解决办法如下:
String cmd = "cmd /c start psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c dir D:\\" >> D:\reuslt.txt
将结果输出到文件,然后通过程序读取文件。 2.单独的java类中运行可以,但是放到JBOSS中运行就无法打印信息的问题,是由于没有将环境变量添加到当前进程中(不知道为何JBOSS程序没有将path添加到进程中),解决方法如下:

final String[] evn = new String[]{"Path=C:\\windows\\system32;C:\\windows\\;C:\\windows\\System32\\Wbem"};
...........
String line = null;
do{
	Process proc = Runtime.getRuntime().exec("cmd /c tasklist | find \"psexec.exe\"", evn);
	BufferedReader rs = new BufferedReader(new InputStreamReader(proc.getInputStream(),"GBK"));
	line = rs.readLine();
	rs.close();
	proc.destroy();
} while(line != null);
3.通过start方法运行的bat文件会单独启动一个进程,即java程序无法获知命令是否已经执行完成。我的解决办法如见2中的代码,就是不停的去查看bat中启动的进程psexec.exe如果该进程不存在了就代表命令已经执行完成。
frpdlut 2012-11-22
  • 打赏
  • 举报
回复
来支持下好基友
桃园闲人 2012-11-21
  • 打赏
  • 举报
回复

Process proc = Runtime.getRuntime().exec("cmd /c tasklist | find \"psexec.exe\"",null,new File("C:\\WINDOWS\\system32"));
		BufferedReader rs = new BufferedReader(new InputStreamReader(proc.getInputStream(),"GBK"));
		String line = null;
		while((line = rs.readLine()) != null){
			System.out.println(line);
		}
这段代码在单独的java类中运行可以,但是放到JBOSS中运行就无法打印信息了。到底为什么?
桃园闲人 2012-11-20
  • 打赏
  • 举报
回复
在使用运行bat文件时,程序不等待结束该如何处理??
String runBat = "cmd /c start "+batPath;
		Process process = Runtime.getRuntime().exec(runBat);
                process.waitFor();//程序在这里不等待!!!!
		process.destroy();
桃园闲人 2012-11-16
  • 打赏
  • 举报
回复
引用 9 楼 ldh911 的回复:
看来还是不行啊? 其实我挺怀疑是需要对getInputStream()单纯输出一些 换行符的“\n” 周末找时间试试看。
恩,谢谢!我使用psexec用指定的用户去执行本机的Clearcase命令访问clearcase服务器。当然这个不是问题的关键。使用方法和上面一样,主要是在 psexec 后面执行命令后DOS界面下可以看到交换信息,但是java程序中就不能获取信息了。
MiceRice 2012-11-16
  • 打赏
  • 举报
回复
看来还是不行啊? 其实我挺怀疑是需要对getInputStream()单纯输出一些 换行符的“\n” 周末找时间试试看。
桃园闲人 2012-11-16
  • 打赏
  • 举报
回复
顶一下。
桃园闲人 2012-11-14
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
String cmd = "cmd /c start psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c dir D:\\"; 这种挑中dos命令的语句最好不要写在一起,先打开界面,再慢慢append命令,这样不会出错。 打开后输入psexec \\\\10.67.192.212 -u china……
一步步来执行是可以,但是每一步都需要认为参与,这样在程序中不好操作呀!还有你刚刚的建议我试了,弹出了MSDOS界面,在界面中结果都出来了,但是无法获取到程序,也无法将结果写入文件,我使用这样修改命令的 psexec \\10.67.192.212 -u china\liuxhwfe -p xxxxxx cmd /c dir D:\ > D:\rs.txt 这个命令能产生rs.txt文件,但是文件内什么都没有。
  • 打赏
  • 举报
回复
String cmd = "cmd /c start psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c dir D:\\"; 这种挑中dos命令的语句最好不要写在一起,先打开界面,再慢慢append命令,这样不会出错。 打开后输入psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c dir D:\\看能执行部,不行的话再修改
桃园闲人 2012-11-14
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
String cmd = "cmd /c psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c dir D:\\"; 改为 String cmd = "cmd /c start psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c d……
谢谢回复! 这样弹出了MSDOS界面了,而且结果也没法直接获取到程序中吧,需要写入文件再读取文件中,不过看到希望了,非常感谢!
  • 打赏
  • 举报
回复
String cmd = "cmd /c psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c dir D:\\"; 改为 String cmd = "cmd /c start psexec \\\\10.67.192.212 -u china\\liuxhwfe -p xxxxxx cmd /c dir D:\\";
桃园闲人 2012-11-14
  • 打赏
  • 举报
回复
引用 6 楼 ldh911 的回复:
没安装这个软件,不负责任的猜测几个可能: 1、换行符解析差异,这个可以尝试换掉readLine()改成逐个字符读取(read())和原样输出; 2、出现特殊错误信息了,这个要从 getErrorStream中读取,可以另外起一个独立线程来试试看; 3、对方等待特定输入,也许默认应发送的比如回车之类的回显信息在JVM这种启动模式下就没了,需要用getOutputStr……
好的,谢谢! 1.这种情况很有可能,我下去试试看; 2.错误信息我是用ErrorStream中获取的,我的命令都是在DOS下验证过的没问题的,在代码中也用ErrorStream测试过,没有错误信息,所以采用的InputStream。 3.我的命令中不会有等待输入的情况,远程执行之后就会马上在控制台输出结果。
MiceRice 2012-11-14
  • 打赏
  • 举报
回复
没安装这个软件,不负责任的猜测几个可能: 1、换行符解析差异,这个可以尝试换掉readLine()改成逐个字符读取(read())和原样输出; 2、出现特殊错误信息了,这个要从 getErrorStream中读取,可以另外起一个独立线程来试试看; 3、对方等待特定输入,也许默认应发送的比如回车之类的回显信息在JVM这种启动模式下就没了,需要用getOutputStream来尝试输出换行或回车。 如果还不行,看有时间再装这个东西试试看。
桃园闲人 2012-11-14
  • 打赏
  • 举报
回复
顶一下,大仙们快来看看呀。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧