如何在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); } } } 

先感谢您!

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

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

  1. 从Java执行shell命令
  2. 想要从Java调用linux shell命令

此外,在这里提供的答案中,我的示例是关于如何使用“host -ta”命令进行DNS查找。 我通常建议您阅读所获得的列表并将其附加到字符串中以进行日志记录。

 p = Runtime.getRuntime().exec("host -ta " + 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 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的更多信息,请阅读文档: 类ProcessBuilder上的Orcale文档