繁体   English   中英

使用Java依次执行两个或多个Shell命令

[英]Execute two or more shell commands sequentially using Java

我想依次在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);

对此,我们将给予任何帮助。

您应该有两个不同的命令来依次执行这两个命令,如下所示:-

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM