¿Cómo cargo / descargo un módulo de kernel de Linux con un programa Java?
-
07-07-2019 - |
Pregunta
Estoy buscando cargar y descargar un módulo de kernel de Linux desde mi programa Java.
Inicialmente intenté hacerlo usando ProcessBuilder para ejecutar los comandos, sin embargo, falla porque el programa no tiene acceso de root. Ejecutar mi programa como root también produce el mismo problema, ya que es un proceso diferente que necesita acceso root.
Entonces, ¿cómo obtengo acceso de root en mi programa para que pueda ejecutar insmod y rmmod. Así es como se ve hasta ahora.
String loader (String s, int i) throws BadLoaderIntException{
if(i == 0){
s = "insmod " + s;
}else if(i == 1){
s = "rmmod " + s;
}else{
throw new BadLoaderIntException();
}
ProcessBuilder pb = new ProcessBuilder("bash", "-c", s);
pb.redirectErrorStream(true); //Outputs to stderr in-case of Error
Process shell = null;
try {
shell = pb.start();
} catch (IOException e) {
e.printStackTrace();
}
InputStream shellIn = shell.getInputStream();
...
Solución
Envuelva su llamada a los módulos en su o sudo y asegúrese de que el proceso de Java se ejecute como root
Otros consejos
Cree un contenedor setuid para modprobe (8)
o insmod(8)
Modprobe (8)
y insmod (8)
no son setuid por razones obvias, pero debería ser seguro hacer un wrapper setuid para ellos que ejecute solo ciertos aprobados cargas Luego, ejecute el contenedor desde java. Solo asegúrese de que los módulos aprobados requieren credenciales raíz para cambiar.