Come lanciare da java un programma con utente root

di il
5 risposte

Come lanciare da java un programma con utente root

Buongiorno,

Dall'interno di un programma Java, avrei l'esigenza di lanciare un altro programma che però deve essere eseguito con i privilegi di root, quindi con il prefisso sudo.

Il mio problema è come passargli la password di root.

Problemi di sicurezza non ce ne sono perché la password la prelevo da un file criptato con un mio algoritmo.

Le istruzioni che sto usando sono:


Runtime.getRuntime().exec(NomeApplicazione);
e
Process process = new ProcessBuilder(NomeApplicazione).start();

La cosa l'avevo già chiesta in questa discusisone:
https://www.iprogrammatori.it/forum-programmazione/java/come-lanciare-programma-java-con-utente-root-t44042.html

ma le indicazioni dell'amico andbin purtroppo non mi funzionano.

Se qualcuno riesce a darmi una dritta utile ringrazio calorosamente.

5 Risposte

  • Re: Come lanciare da java un programma con utente root

    Il comando sudo accetta lo swich -S per leggere la password da STDIN, quindi, banalmente, con un pipe:

    $echo <tua password> | sudo -S <comando>

    In questo modo dovresti riuscire a passargliela.

    Come diceva andbin, devi ottenere il Process, da questo ottenere l'OutputStream e scrivere la password lì dentro poichè l'operazione di pipe è nativa della shell.

    Appena ho un attimo provo anch'io.

  • Re: Come lanciare da java un programma con utente root

    Ho fatto un test e non ho avuto problemi.

    Con questo codice ho stoppato il servizio mariadb:

    import java.io.*;
    
    public class ExecSudo {
        public static void main(String[] args) throws Exception {
            String userPassword = ...;
            Process p = Runtime.getRuntime().exec("sudo -S systemctl stop mariadb");
            OutputStream os = p.getOutputStream();
            PrintStream ps = new PrintStream( os );
            ps.println( userPassword );
            ps.flush();
            ps.close();
        }
    }
    

    Ovviamente usando la mia password dell'utente che deve essere nel gruppo sudoers.

  • Re: Come lanciare da java un programma con utente root

    Carissimo SpiritoLibero,

    sei un mito! Ti ringrazio di vero cuore!
    Mi hai risolto un problema che mi assillava da parecchio tempo!

    Mi funzionano i vari start e stop di apache, mysql e altre cose.

    Pizza pagata! E non scherzo. Se vivi nei paraggi di Busto Garolfo o passi da queste parti scrivimi in privato che organizziamo una pizzata.

    Mi resta solo da capire come mai invece con un'applicazione come openshot-qt non funziona.
    Ovvero parte da menù di start, ma non dal mio programma Java, ne con il sudo ne senza.
    Da terminale parte senza anteporre il sudo, ma genera tutta una serie di messaggi con il prefisso INFO…
    Sarà per quello?
    C'è per caso qualche parametro da impostare nell'istruzione Runtime.getRuntime per gestire l'output del programma che si esegue? 

  • Re: Come lanciare da java un programma con utente root

    26/02/2024 - ZioCrick ha scritto:


    Mi resta solo da capire come mai invece con un'applicazione come openshot-qt non funziona.
    Ovvero parte da menù di start, ma non dal mio programma Java, ne con il sudo ne senza.
    Da terminale parte senza anteporre il sudo, ma genera tutta una serie di messaggi con il prefisso INFO…
    Sarà per quello?
    C'è per caso qualche parametro da impostare nell'istruzione Runtime.getRuntime per gestire l'output del programma che si esegue? 

    E qui, purtroppo, non posso sapere cosa succeda sulla macchina.

    Per gestire l'output del programma, ovviamente, si deve ottenere l'oggetto InputStream dal Process (come fatto per l'OutputStream) e leggerlo.

    Qualcosa di simile a questo:

    Process p = Runtime.getRuntime().exec( ... );
    
    ...   // Se devi passare qualcosa tramite l'OutputStream
    
    InputStream is = p.getInputStream();
    InputStreamReader isr = new InputStreamReader( is );
    BufferesReader br = new BufferedReader( isr );
    String line = null;
    // Leggo riga per riga l'output del programma...
    while((line = br.readLine()) != null) {
       //... e lo stampo in console
       System.out.println( line );
    }

    Prova a vedere.

  • Re: Come lanciare da java un programma con utente root

    Carissimo, anche sta volta ci hai azzeccato!

    Anche se si stanno verificando dei comportamenti strani… infatti se lo lancio con l'esatto codice che hai scritto tu, parte, ma mi da un errore sull'audio e la println non produce alcun messaggio, come se ne ciclo while non ci entrasse nemmeno.

    Allora ho provato a commentare il ciclo e partiva ugualmente, sempre con lo stesso errore.

    Mentre se cambio il ciclo while in questo modo:

    String line = null;
    line = br.readLine();
    while(sBuff.length() > 0) {
      System.out.println( line );
      line = br.readLine();
    }

    il programma si blocca sulla prima readline, come se fosse in attesa di qualcosa che non arriva!

    Poi ho provato a reinstallarlo con Synaptic (sto usando Debian 12.5) e adesso non parte a meno che lascio il ciclo while.

    Inoltre ho scoperto che se lo faccio partire da terminale senza sudo parte regolamente e non da errori, se invece lo faccio partire con il sudo mi da una sfilza di errori nel terminale e la stessa segnalazione sull'audio!

    Non ci sto capendo nulla.
    Devo fare ulteriori indagini e prove.

    Comunque, ti ringrazio tanto per la tua disponibilità. 

Devi accedere o registrarti per scrivere nel forum
5 risposte