¿Cómo ejecutar el comando bash con privilegios sudo en Java?

Estoy usando ProcessBuilder para ejecutar comandos bash:

import java.io.IOException; public class Main { public static void main(String[] args) { try { Process pb = new ProcessBuilder("gedit").start(); } catch (IOException e) { e.printStackTrace(); } } } 

Pero quiero hacer algo como esto:

 Process pb = new ProcessBuilder("sudo", "gedit").start(); 

¿Cómo pasar la contraseña de superusuario a bash?

("gksudo", "gedit") no funcionará, porque fue eliminado desde Ubuntu 13.04 y necesito hacer esto con los comandos predeterminados disponibles.

EDITAR

gksudo regresó a Ubuntu 13.04 con la última actualización.

Creo que puedes usar esto, pero estoy un poco indeciso para publicarlo. Así que solo diré:

Úselo bajo su propio riesgo, no recomendado, no me demande, etc.

 public static void main(String[] args) throws IOException { String[] cmd = {"/bin/bash","-c","echo password| sudo -S ls"}; Process pb = Runtime.getRuntime().exec(cmd); String line; BufferedReader input = new BufferedReader(new InputStreamReader(pb.getInputStream())); while ((line = input.readLine()) != null) { System.out.println(line); } input.close(); } 

Edite / etc / sudoers con visudo y otorgue a su usuario un derecho NOPASSWD para un script específico:

nombre de usuario ALL = (ALL) NOPASSWD: /opt/yourscript.sh

Mi solución, no expone la contraseña en la línea de comando, solo envía la contraseña al flujo de salida del proceso. Esta es una solución más flexible porque le permite solicitar la contraseña al usuario cuando sea necesario.

 public static boolean runWithPrivileges() { InputStreamReader input; OutputStreamWriter output; try { //Create the process and start it. Process pb = new ProcessBuilder(new String[]{"/bin/bash", "-c", "/usr/bin/sudo -S /bin/cat /etc/sudoers 2>&1"}).start(); output = new OutputStreamWriter(pb.getOutputStream()); input = new InputStreamReader(pb.getInputStream()); int bytes, tryies = 0; char buffer[] = new char[1024]; while ((bytes = input.read(buffer, 0, 1024)) != -1) { if(bytes == 0) continue; //Output the data to console, for debug purposes String data = String.valueOf(buffer, 0, bytes); System.out.println(data); // Check for password request if (data.contains("[sudo] password")) { // Here you can request the password to user using JOPtionPane or System.console().readPassword(); // I'm just hard coding the password, but in real it's not good. char password[] = new char[]{'t','e','s','t'}; output.write(password); output.write('\n'); output.flush(); // erase password data, to avoid security issues. Arrays.fill(password, '\0'); tryies++; } } return tryies < 3; } catch (IOException ex) { } return false; } 

Una vez que genera un proceso, puede extraer los flujos de entrada y salida. Simplemente ingrese la contraseña en la secuencia de salida (la envía a la entrada del proceso). Entonces el código se vería como …

 Process pb = new ProcessBuilder("gedit").start(); OutputStream out = pb.getOutputStream(); out.write(password); 

Sé que este es un hilo viejo, pero solo quiero poner esto aquí:

puedes usar sudo -S *command* como un comando que pasas para crear la instancia del Proceso. Luego obtenga la secuencia de salida y escriba la contraseña y agregue al final una nueva línea y una c. return ( \n\r ). La devolución puede no ser necesaria, pero la pasé por si acaso. También es una buena idea descargar la secuencia, para asegurarse de que todo esté escrito en ella. Lo he hecho varias veces y funciona como un encanto. Y NO te olvides de cerrar las transmisiones :).

No intente escribir una contraseña del sistema claramente en un archivo, especialmente para un usuario que tenga el privilegio de sudo, así como se respondió @jointEffort, el privilegio emitido debe ser resuelto por los administradores del sistema, no por los escritores de la aplicación. sudo permite otorgar privilegios para un comando específico a un usuario específico, que es lo suficientemente preciso, consulte esta publicación

y puede elegir administrar el privilegio en un archivo separado que no sea el archivo sudoers principal si solo desea agregar #includedirs /etc/sudoers.d/ en el /etc/sudoers (la mayoría de las distribuciones de Linux ya lo han hecho) y crea un archivo como ifconfig-user con:

  USER_NAME ALL=(ALL) NOPASSWD: /sbin/ifconfig 

Otra cosa, recuerda editar el archivo de configuración con visudo en caso de que visudo control de tu sistema cuando hay un error de syntax.