Como faço para carregar / descarregar um Linux kernel do módulo com um programa Java?
-
07-07-2019 - |
Pergunta
Eu estou olhando para carregar e descarregar um Linux Kernel módulo do meu programa Java.
Inicialmente eu tentei fazê-lo usando ProcessBuilder para executar os comandos, no entanto, ele falha porque o programa does not tiver acesso de root. Correndo o meu programa como root também produz o mesmo problema que é um processo diferente, que precisa do acesso de root.
Assim como o acesso adquirir raiz I no meu programa, por isso é permitido insmod corrida e rmmod. Isto é o que parece tão longe.
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();
...
Solução
Enrole a sua chamada para módulos em su ou sudo e certifique-se que o processo java a correr como root
Outras dicas
Faça um invólucro setuid para modprobe(8)
ou insmod(8)
Modprobe(8)
e insmod(8)
não são setuid por razões óbvias, mas ele deve ser seguro para fazer um invólucro setuid para eles que executa apenas certas cargas aprovados. Em seguida, execute o wrapper de java. Apenas certifique-se os módulos aprovados exigir credenciais de root para mudar.