psexec在JVM中无法获取交互信息,高手进来看看。本帖最后由 peng_hao1988 于 2012-11-14 09:52:24 编辑psexe
psexec在JVM中无法获取交互信息,高手进来看看。
本帖最后由 peng_hao1988 于 2012-11-14 09:52:24 编辑 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()这里执行一次,即读取到第一行后就不向下执行,一直卡在这里。
[最优解释]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:\";
[其他解释]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:\\看能执行部,不行的话再修改
[其他解释] 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中运行就无法打印信息了。到底为什么?
[其他解释]谢谢回复!
这样弹出了MSDOS界面了,而且结果也没法直接获取到程序中吧,需要写入文件再读取文件中,不过看到希望了,非常感谢!
[其他解释]一步步来执行是可以,但是每一步都需要认为参与,这样在程序中不好操作呀!还有你刚刚的建议我试了,弹出了MSDOS界面,在界面中结果都出来了,但是无法获取到程序,也无法将结果写入文件,我使用这样修改命令的
psexec \\10.67.192.212 -u china\liuxhwfe -p xxxxxx cmd /c dir D:\ > D:\rs.txt
这个命令能产生rs.txt文件,但是文件内什么都没有。
[其他解释]
顶一下,大仙们快来看看呀。
[其他解释]
没安装这个软件,不负责任的猜测几个可能:
1、换行符解析差异,这个可以尝试换掉readLine()改成逐个字符读取(read())和原样输出;
2、出现特殊错误信息了,这个要从 getErrorStream中读取,可以另外起一个独立线程来试试看;
3、对方等待特定输入,也许默认应发送的比如回车之类的回显信息在JVM这种启动模式下就没了,需要用getOutputStream来尝试输出换行或回车。
如果还不行,看有时间再装这个东西试试看。
[其他解释]
好的,谢谢!
1.这种情况很有可能,我下去试试看;
2.错误信息我是用ErrorStream中获取的,我的命令都是在DOS下验证过的没问题的,在代码中也用ErrorStream测试过,没有错误信息,所以采用的InputStream。
3.我的命令中不会有等待输入的情况,远程执行之后就会马上在控制台输出结果。
[其他解释]顶一下。
[其他解释]看来还是不行啊?
其实我挺怀疑是需要对getInputStream()单纯输出一些 换行符的“\n”
周末找时间试试看。
[其他解释]恩,谢谢!我使用psexec用指定的用户去执行本机的Clearcase命令访问clearcase服务器。当然这个不是问题的关键。使用方法和上面一样,主要是在 psexec 后面执行命令后DOS界面下可以看到交换信息,但是java程序中就不能获取信息了。
[其他解释]在使用运行bat文件时,程序不等待结束该如何处理??
String runBat = "cmd /c start "+batPath;
Process process = Runtime.getRuntime().exec(runBat);
process.waitFor();//程序在这里不等待!!!!
process.destroy();
[其他解释]
Process proc = Runtime.getRuntime().exec("cmd /c tasklist
[其他解释]
来支持下好基友