Как выполнить команду оболочки в Java?

4

Я думал, могу ли я отправить оболочку для выполнения Client-Server ipconfig. Возможно ли это?

Это мой код в Local:

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

Благодарим вас в Advance!

Теги:

1 ответ

13
Лучший ответ

Не очень дружественный вопрос для Stackoverflow, так как я не уверен, что вы спрашиваете о выполнении команды Shell или вообще ipconfig.

Если это первый случай: Да, вы можете использовать Runtime.getRuntime.exec(). Ответы на вопросы (В Stackoverflow):

Кроме ответов на предоставленные здесь ответы, вот мой пример о том, как вы это делаете с командой "host -t" для поиска DNS. Обычно я рекомендую прочитать список, который вы получите, и добавить их в String для ведения журнала.

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 для Class ProcessBuilder

  • 0
    Но я должен создать еще один .java для сервера с этим кодом?
  • 0
    Ну да, для лучшей практики: поместите коды, которые связаны между собой. Например, создайте Util.java и поместите его туда, или, если быть более точным, произнесите ShellUtil.java и создайте общую функцию, которая позволяет вызывать любую команду оболочки.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню