![](/img/trans.png)
[英]How to execute commands inside a shell using Process object in Java
[英]Execute two or more shell commands sequentially using Java
我想依次在Linux上的Shell中依次执行telnet和msh 。 我可以使用以下Java代码执行telnet命令,但不能执行msh命令:
List<String> commands = new ArrayList<String>();
commands.add("/bin/bash");
commands.add("-c");
commands.add("telnet 10.x.x.x 1234");
commands.add("msh");
ProcessBuilder pb = new ProcessBuilder(commands);
pb.directory(new File("/home/user"));
pb.redirectErrorStream(true);
Process process = pb.start();
// Read output
StringBuilder out = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line = null, previous = null;
while ((line = br.readLine()) != null) {
if (!line.equals(previous)) {
previous = line;
out.append(line).append('\n');
System.out.println(line);
}
}
// Check result
if (process.waitFor() == 0) {
System.out.println("Success executing telnet command!");
System.exit(0);
}
System.err.println(commands);
System.err.println(out.toString());
System.exit(1);
对此,我们将给予任何帮助。
您应该有两个不同的命令来依次执行这两个命令,如下所示:-
String[] command_telnet ={"\path\to\telnet", "10.x.x.x 1234"};
String[] command_msh ={"\path\to\msh", "parameter"};
ProcessBuilder pb_telnet = new ProcessBuilder(commands);
pb_telnet.directory(new File("/home/user/telnet_output.txt"));
pb_telnet.redirectErrorStream(true);
Process process_tel = pb_telnet.start();
对command_msh
执行相同的操作。 您可以轻松调试该方法,因为您将在/home/user/msh_output.txt
获得命令输出
您当前正在执行的Java是以下内容(或多或少;以下内容可以在Shell中执行,Java直接调用进程):
/bin/bash -c 'telnet 10.x.x.x 1234' 'msh'
这导致Bash执行telnet,因为这是-c
标志的参数,而msh参数将被忽略:Bash不知道如何处理。
有两种可能的解决方案。
解决方案1:让Bash依次执行两个命令。
为此,您需要执行以下几行
/bin/bash -c 'telnet 10.x.x.x 1234; msh'
这意味着您必须合并commands
列表中的最后两个字符串。 例如,
commands.add("telnet 10.x.x.x 1234; msh");
代替使用;
您也可以使用&&
。 有关更多详细信息,请参见Unix.SE。
缺点:Bash仅会让您知道最后一个进程的退出代码。 在使用&&
的情况下,使第一个命令失败甚至不会执行第二个命令。
解决方案2:分别使用Java创建一个单独的进程。
对于此解决方案,您基本上必须重复所有代码以调用msh。 如果您采用这种方法,建议您将其包装在函数中。 只需使用{"/bin/bash", "-c", "telnet 10.xxx 1234"}
作为一次调用的commands
列表,然后使用{"/bin/bash", "-c", "msh"}
用于其他调用。
优点是您可以在Java程序中拥有更多控制权,而不是让Bash处理事情。 缺点是您要启动两个单独的过程,但是Bash仍可能在后台进行此操作。
旁注:您可以直接执行telnet和msh,而无需调用Bash并告诉它为您运行telnet或msh。 这样可能会更好,更有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.