我必须在Unix平台上从Java程序执行命令。
我正在使用Runtime.getRuntime()
。
然而,问题是我的命令是交互式的,并在运行时询问某些参数。例如,命令是createUser
。它要求userName
作为运行时。
bash-4.1$ createUser
Enter the UserName:
如何处理这样的场景,以便在运行时从Java程序输入用户名?
try {
Process proc;
proc = Runtime.getRuntime().exec(cmd, envp);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
// read the output from the command
String s = null;
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
sb.append(s);
}
// read any errors from the attempted command
while ((s = stdError.readLine()) != null) {
System.out.println(s);
sb.append(s);
}
} catch (Exception e) {
e.printStackTrace();
sb = null;
}
我听说可以通过期待完成。但是我怎么能用Java做呢?
答案 0 :(得分:0)
从proc获取standardOutput。您在该standardOutput中编写的所有内容都将转到命令
将用户名发送到standardOutput并且不要忘记发送\ n。
答案 1 :(得分:0)
您可以检查输入流的最后一行是什么,当您检测到用户输入输入的提示时,请将输出值写入您的值。
try {
Process proc;
proc = Runtime.getRuntime().exec(cmd, envp);
final BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
final PrintWriter stdOutput = new PrintWriter(proc.getOutputStream());
// read the output from the command
String s = null;
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
if (s.equals("Enter your username")) {
stdOutput.println("MyUsername");
stdOutput.flush();
}
sb.append(s);
}
} catch (final Exception e) {
e.printStackTrace();
sb = null;
}
(为简单起见,删除了错误流)
请注意,如果提示以新行结尾,则仅。
如果提示没有新行(例如Username: <cursor here>
),您可以尝试在开头写入值:
...
final PrintWriter stdOutput = new PrintWriter(proc.getOutputStream());
stdOutput.println("MyUsername");
stdOutput.flush();
...
但是如果该命令清除缓冲区,则无效,在这种情况下(极少数情况下),您必须更改从流中读取的方式(例如,而不是行,读取字节)