¿Cómo ejecutar comandos nativos de Shell desde el programa Java?

Un comando de shell es un comando que podemos activar usando un teclado y una línea de comandos o un shell en lugar de una interfaz gráfica de usuario. Por lo general, activaríamos los comandos de shell manualmente. Sin embargo, puede haber casos en los que esto deba hacerse mediante programación a través de Java.

Java proporciona soporte para ejecutar comandos de shell nativos con dos clases: RunTime y ProcessBuilder . La principal desventaja de usar estas clases y ejecutar comandos de shell desde dentro de un programa Java es que Java pierde su portabilidad.

¿Qué significa perder la portabilidad?

Java se rige por el principio » compilar una vez, ejecutar en cualquier lugar «. Esto significa que un programa Java escrito y compilado en un sistema operativo puede ejecutarse en cualquier otro sistema operativo sin realizar ningún cambio. 

Cuando usamos las clases ProcessBuilder o Runtime para ejecutar comandos de shell nativos, hacemos que el programa Java dependa del sistema operativo subyacente. Por ejemplo, un programa Java que ejecuta específicamente comandos de shell de Linux no puede ejecutarse tal cual en una máquina con Windows principalmente porque Windows tiene una estructura de carpetas y comandos de shell diferentes.

Ejemplos:

Los tres primeros ejemplos analizarán la implementación de la clase ProcessBuilder para ejecutar comandos de shell en Java. El siguiente ejemplo es para la clase RunTime.

Ejemplo 1: Pérdida de portabilidad.

Este ejemplo muestra lo que sucede si ejecutamos un programa Java destinado al sistema operativo Linux/Unix en un sistema operativo Windows.  

Java

// if we execute a Java program meant for the Linux/Unix
// operating system on a Windows operating system
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
  
public class ShellCommandRunner4 {
    public static void main(String[] args)
    {
        try {
  
            System.out.println(
                System.getProperty("os.name"));
            System.out.println();
  
            // This process cannot be run on Windows. So the
            // program will throw an exception.
            ProcessBuilder pb
                = new ProcessBuilder("sh", "-c", "ls");
            // Exception thrown here because folder
            // structure of Windows and Linux are different.
            pb.directory(
                new File(System.getProperty("user.home")));
            // It will throw and exception
            Process process = pb.start();
  
            StringBuilder output = new StringBuilder();
            BufferedReader reader
                = new BufferedReader(new InputStreamReader(
                    process.getInputStream()));
  
            String line;
            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }
  
            int exitVal = process.waitFor();
            if (exitVal == 0) {
                System.out.println(
                    "**************************** The Output is ******************************");
                System.out.println(output);
                System.exit(0);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

El resultado del programa anterior cuando se ejecuta en una máquina con Windows.

Ejemplo 2: ejecutar un comando de shell simple

Este ejemplo muestra cómo ejecutar un comando simple de shell de Windows. Usamos una lista para construir comandos y luego los ejecutamos usando el método de «inicio» de la clase ProcessBuilder. El programa ejecuta el comando para encontrar los procesos del navegador Chrome de la lista de tareas que se ejecuta en la máquina.

Java

// Run a simple Windows shell command
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
  
public class ShellCommandRunner {
  
    public static void main(String[] args)
    {
  
        ProcessBuilder processBuilder
            = new ProcessBuilder();
  
        List<String> builderList = new ArrayList<>();
  
        // add the list of commands to a list
        builderList.add("cmd.exe");
        builderList.add("/C");
        builderList.add("tasklist | findstr chrome");
  
        try {
            // Using the list , trigger the command
            processBuilder.command(builderList);
            Process process = processBuilder.start();
  
            // To read the output list
            BufferedReader reader
                = new BufferedReader(new InputStreamReader(
                    process.getInputStream()));
  
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
  
            int exitCode = process.waitFor();
            System.out.println("\nExited with error code : "
                               + exitCode);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Procesos del navegador Chrome.

Ejemplo 3: ejecutar un archivo bat

Este ejemplo muestra cómo ejecutar un programa .bat simple en la consola de Java. El archivo .bat muestra la información del sistema de Windows. 

Java

// Run a simple .bat program in the Java console
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
  
public class ShellCommandRunner3 {
    public static void main(String[] args)
    {
        try {
            // File location for the bat script
            File dir = new File("D:\\bat_scripts");
            // Command to run the bat file in the same
            // console
            ProcessBuilder pb = new ProcessBuilder(
                "cmd.exe", "/C", "sysinfo.bat");
            pb.directory(dir);
            Process process = pb.start();
  
            StringBuilder output = new StringBuilder();
            BufferedReader reader
                = new BufferedReader(new InputStreamReader(
                    process.getInputStream()));
  
            String line;
            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }
  
            int exitVal = process.waitFor();
            if (exitVal == 0) {
                System.out.println(
                    "**************************** The Output is ******************************");
                System.out.println(output);
                System.exit(0);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Salida del programa del archivo bat de información del sistema

Ejemplo 4: Ejecute un comando de shell utilizando la clase RunTime.

Este ejemplo muestra cómo ejecutar un comando simple usando la clase RunTime. Usamos el método exec() de la clase Runtime.

Java

// Run a simple command using the RunTime class
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
  
public class ShellCommandRunner2 {
  
    public static void main(String[] args)
    {
  
        try {
            Process process
                = Runtime.getRuntime().exec("where java");
  
            StringBuilder output = new StringBuilder();
  
            BufferedReader reader
                = new BufferedReader(new InputStreamReader(
                    process.getInputStream()));
  
            String line;
            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }
  
            int exitVal = process.waitFor();
            if (exitVal == 0) {
                System.out.println(
                    "**************************** The Output is ******************************");
                System.out.println(output);
                System.exit(0);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

donde java en el programa Java

Publicación traducida automáticamente

Artículo escrito por reshmasathe y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *