【问题标题】:Execute two or more shell commands sequentially using Java使用 Java 顺序执行两个或多个 shell 命令
【发布时间】:2018-09-18 18:33:54
【问题描述】:

我想在Linux的shell中依次执行telnetmsh。我可以使用以下 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);

非常感谢您对此的任何帮助。

【问题讨论】:

  • 如何连接所有用 & 分隔的命令?
  • @BarathVutukuri,连接所有命令将不会在提示更改(#)到(msh

标签: java shell processbuilder


【解决方案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 中获得命令输出

【讨论】:

  • 命令是相互关联的,即必须一个接一个地执行 telnet 执行后,msh 必须在同一个提示符下执行。 @Abhijit Pritam
  • @Anand,它只会这样工作。对于if (process_tel.waitFor() == 0 &amp;&amp; process_msh.waitFor() == 0 ) ,您必须更改您的 if 条件。试试我的方法,让我知道是否有效。
【解决方案2】:

您目前让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");

您也可以使用&amp;&amp;,而不是使用;。详情请见Unix.SE

缺点:Bash 只会让你知道最后一个进程的退出代码。在使用&amp;&amp;的情况下,第一个命令失败甚至不会执行第二个。

解决方案 2:在 Java 中为每个进程创建一个单独的进程。
对于此解决方案,您基本上必须重复所有代码以调用 msh。如果你走这条路,我建议将它包装在一个函数中。只需将{"/bin/bash", "-c", "telnet 10.x.x.x 1234"} 用作commands 的列表进行一次调用,使用{"/bin/bash", "-c", "msh"} 进行另一次调用。

优点是您对 Java 程序有更多的控制权,而不是让 Bash 处理事情。缺点是您启动了两个独立的进程,但 Bash 可能会在后台执行此操作。


旁注:您可以直接执行 telnet 和 msh,而无需调用 Bash 并告诉它为您运行 telnet 或 msh。这可能会更好,更高效。

【讨论】:

  • 命令是相互关联的,必须一个接一个地执行。 telnet 执行后,msh 必须在相同的提示符下执行。 @只是一个学生
  • 对,那就是解决方案 1,@Anand。
  • 解决方案 1 也只执行 telnet 命令。 @只是一个学生
  • 它应该可以,它对我有用。您确定替换了commands 的最后两部分,使得列表为{"/bin/bash", "-c", "telnet 10.x.x.x 1234; msh"}
猜你喜欢
  • 2017-09-01
  • 2013-01-08
  • 1970-01-01
  • 2010-11-23
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多