我想编写一个java程序来检索在不同服务器上运行的所有服务的状态(大约20个)。为此我使用SC命令,我可以使用java程序。但现在我陷入了一种情况,我想通过使用RUNAS作为不同的用户运行SC命令,我面临的问题是,一旦命令第一次执行,我无法输入密码。以下是我正在使用的代码: -
String[] command = new String[3];
command[0] = "cmd";
command[1] = "/c";
command[2] = "runas /noprofile /user:domain\\admin \"sc \\\\serverName queryex type= service state= all\"";
Process p = Runtime.getRuntime().exec(command);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(p.getOutputStream())), true);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = reader.readLine();
while (line != null) {
new PrintWriter(p.getOutputStream(),true).println("AdminPassword");
System.out.println(line);
line = reader.readLine();
}
BufferedReader stdInput = new BufferedReader(newInputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String Input;
while ((Input = stdInput.readLine()) != null) {
System.out.println(Input);
}
String Error;
while ((Error = stdError.readLine()) != null) {
System.out.println(Error);
}
但我无法打印所有服务的状态。提供密码后我不确定是否需要捕获其他流或者其他?
对此有何帮助?
由于
答案 0 :(得分:0)
在while (line != null)
循环中,为您阅读的每一行打开一个新的PrintWriter。您可以将管理员密码打印到这些编写器,但不要关闭或刷新它们。
尝试上面创建的PrintWriter writer
,写完密码后flush()
,否则它仍会在缓冲区中。
您还可以在Process的inputStream上创建多个BufferedReader
,这可能会相互干扰。
所以:只创建一个读者。 writer的inputStream,errorStream和outputStream的编写器。
答案 1 :(得分:-1)
使用java.io.Console
包可以读取密码。请使用以下代码从cmd提示中读取密码
Console c = System.console();
String login = c.readLine("Enter your login: ");
char [] password= c.readPassword("Enter your password: ");