Forum Programmation.java Authentification pour une commande exécutée dans un exec()

Posté par  .
Étiquettes : aucune
0
28
juin
2006
Bonsoir, j'ai un projet où j'utilise des commandes shell pour effectuer certaines actions comme par exemple arreter un processus ou editer un *.conf.

Le probleme c'est que pour ces commandes j'ai besoins d'être en root et je n'arrive pas a effectuer une authentification à partir de l'exec.

Runtime vl_rt = Runtime.getRuntime();

String[] cmd = {"su","sh","-c","\""+_cmd+"\""};
Process vl_pr = vl_rt.exec(cmd);


Ici "Su" va demander un mot de passe pour effectuer ma commande mais je ne vois pas du tout comment le renseigner automatiquement..

Il y a pourtant certains programmes qui demandent une fois le mot de passe root au lancement de l'appli et ensuite on peut effectuer des opérations en root, donc il doit y avoir une solution.

Si quelqu'un la connait je suis tout ouïe ^^
  • # stdin

    Posté par  . Évalué à 2.

    En C une solution serait de trafiquer le processus fils pour remplacer son stdin par un pipe, en utilisant popen(3) par exemple. popen(3) étant POSIX.2, peut être est-elle disponible directement dans l'API Java.

    En Java pur, en regardant sur google vite fait j'ai trouvé ça:
    http://download.eclipse.org/tptp/4.2.0/javadoc/Platform/publ(...)

    Plus particulièrement, la fonction:
    public java.io.OutputStream getStandardInputStream()
    throws ExecutionComponentStateException
    Get the OutputStream for writing to the process's stdin pipe. It is available after process is launched.

    Voilà, j'espère que ça pourra t'aider.
    • [^] # Re: stdin

      Posté par  . Évalué à 2.

      Bon, j'ai même trouvé du code qui marche:

      FILE *s1 = popen("command", "r");

      =

      Process process = Runtime.getRuntime().exec("command");
      BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

      Y a pas à dire c'est verbeux le Java :)
      • [^] # Re: stdin

        Posté par  . Évalué à 1.

        Merci je vais essayer ça ;)
      • [^] # Re: stdin

        Posté par  . Évalué à 1.

        Bon je n'y arrive pas mieux, grâce à tes indications j'ai pu orienter mes recherches et voila le code que j'ai pour le moment :
        (en grande partie récupéré)

        try {


        String[] cmd = {"sudo"," ps -A -eo pid,fname"};


        // lancement de la commande
        Runtime r = Runtime.getRuntime();
        Process p = r.exec(cmd);

        // récupération du mot de passe
        String rpass = JOptionPane.showInputDialog(null, "Mot de passe root :");

        // flux en entrée du process
        OutputStream os = p.getOutputStream();
        // flux en sortie du process
        InputStream is = p.getInputStream();

        // initialisation du printwriter pour écrire dans le flux
        PrintWriter writer = new PrintWriter(os, true);


        p.waitFor();

        // je lui donne le mot de passe
        writer.println(rpass);

        // Création du bufferedReader pour lire le résultat
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        // affichage de la sortie du process
        String line;
        while((line = reader.readLine()) != null)
        {
        System.out.println(line);
        }

        p.waitFor();
        p.destroy();
        rpass = null;
        }
        catch (Exception e){
        System.out.println("arf");

        }
        }

        En résultat je n'ai rien, je fourni le mot de passe et l'application se termine.

        j'ai testé avec juste : String cmd = "ps -A -eo pid,fname";
        et j'obtiens bien ma liste de processus.

        si je mets sudo à la place de su, ça reste en attente..

        Je n'ai pas trouvé de moyen de vérifier l'état des flux et après 3 jours de recherche, je n'arrive toujours à rien :/

        il manque peut etre un truc tout bête..

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.