java - 如何在 Java 中执行 shell 命令?

标签 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);
        }
    }
}

提前致谢!

最佳答案

我不确定你问的是 Shell 命令执行,还是一般的 ipconfig。

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

  1. Executing shell commands from Java
  2. Want to invoke a linux shell command from Java

除了那里提供的答案之外,这里是我的示例,说明如何使用“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 的更多信息,请通读文档:Oracle Documentation on Class ProcessBuilder

关于java - 如何在 Java 中执行 shell 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23322740/

相关文章:

linux - 为什么我的命名管道输入命令行在被调用时挂起?

java - 如何在 Java 或 Groovy 中为多种语言获取数字的序数后缀

java - 来自 MS Exchange OWA 的 HTML 正文中的响应 'Bad request'

java - 有没有一段时间你不会使用递归?

java - SocketChannel.write() 写入问题

android - 获取Android系统开机时间的方法

linux - : 1: Syntax error: "(" unexpected error

linux - 如何使用 Grep 命令查找文本文件中的特定值

bash - CSV 复制/复制第一行到表格

java - contextDestroyed() 与 addShutdownHook()