如何在Java中执行shell命令?

时间:2014-04-27 11:21:24

标签: java shell

我在想是否可以发送shell来执行Client-Server ipconfig。这可能吗?

这是我在本地的代码:

class Comando {
    public static void main(String args[]) {

        String s = null;

        try {

            // Determinar en qué SO estamos
            String so = System.getProperty("os.name");
            String comando;
            // Comando para Linux
            if (so.equals("Linux"))
                comando = "ifconfig";
            // Comando para Windows
            else
                comando = "ipconfig";

            // Ejcutamos el comando
            Process p = Runtime.getRuntime().exec(comando);

            BufferedReader stdInput = new BufferedReader(new InputStreamReader(
                    p.getInputStream()));

            BufferedReader stdError = new BufferedReader(new InputStreamReader(
                    p.getErrorStream()));

            // Leemos la salida del comando
            System.out.println("Ésta es la salida standard del comando:\n");
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }

            // Leemos los errores si los hubiera
            System.out
                    .println("Ésta es la salida standard de error del comando (si la hay):\n");
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }

            System.exit(0);
        } catch (IOException e) {
            System.out.println("Excepción: ");
            e.printStackTrace();
            System.exit(-1);
        }
    }
}

提前谢谢你!

1 个答案:

答案 0 :(得分:14)

不是一个非常友好的Stackoverflow问题,因为我不确定你是在询问Shell命令执行还是ipconfig。

如果第一种情况是这样的:是的,你可以使用Runtime.getRuntime.exec()。 相关答案(在Stackoverflow中):

  1. Executing shell commands from Java
  2. Want to invoke a linux shell command from Java
  3. 此外,在这里提供的答案中,我的例子是关于你如何使用" host -t a"用于DNS查找的命令。我通常建议您阅读所获得的列表并将其附加到字符串中以进行日志记录。

    p = Runtime.getRuntime().exec("host -t a " + domain);
    p.waitFor();
    
    BufferedReader reader = 
      new BufferedReader(new InputStreamReader(p.getInputStream()));
    
    String line = "";           
    while ((line = reader.readLine())!= null) {
        sb.append(line + "\n");
    }
    

    herau建议的另一个解决方案是使用ProcessBuilder并从那里执行命令。为此,您需要向上使用Java SE 7。下面是一个使用修改后的工作目录和环境启动进程的示例,并将标准输出和错误重定向到日志文件中:

     ProcessBuilder pb =
       new ProcessBuilder("myCommand", "myArg1", "myArg2");
     Map<String, String> env = pb.environment();
     env.put("VAR1", "myValue");
     env.remove("OTHERVAR");
     env.put("VAR2", env.get("VAR1") + "suffix");
     pb.directory(new File("myDir"));
     File log = new File("log");
     pb.redirectErrorStream(true);
     pb.redirectOutput(Redirect.appendTo(log));
     Process p = pb.start();
     assert pb.redirectInput() == Redirect.PIPE;
     assert pb.redirectOutput().file() == log;
     assert p.getInputStream().read() == -1;
    

    如果您想了解有关ProcessBuilder的更多信息,请阅读文档:Orcale Documentation on Class ProcessBuilder