IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Commande linux sous Java !


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Points : 76
    Points
    76
    Par défaut Commande linux sous Java !
    Bonjours,


    Je cherche à exécuter une commande linux sous Java, jusque là, pas trop compliqué, j'ai réussit à trouvé des infos ceci !

    Sauf que la commande que je cherche à exécuter est "mount -a" pour recharger mon fichier fstab.

    d'après mes recherche cette commande n'est exécutable que par l'utilisateur root...
    je cherche donc une solution pour exécuter cette action, en changeant d'utilisateur, et là, je sèche un peu !

    Voici mon code pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    try {
        System.out.println("Teste d'exec cmd :");
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("mount -a");
        InputStream stdin = proc.getInputStream();
        InputStreamReader isr = new InputStreamReader(stdin);
        BufferedReader br = new BufferedReader(isr);
        String line = null;
        System.out.println("<OUTPUT>");
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        System.out.println("</OUTPUT>");
        int exitVal = proc.waitFor();
     
        System.out.println("Process exitValue: " + exitVal);
    } catch (Throwable t) {
        System.out.println("Test KO");
        System.out.println(t);
    }
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Première option : exécuter ton programme Java en tant que root. Ce sera ainsi automatiquement root qui lancera la commande "mount".

    Deuxième option : lancer un enchaînement de commandes shell (changement d'utilisateur, saisie du mot de passe root, exécution du mount).

    Dans ce cas, ta piste est bonne : il faut "jouer" avec les flux d'entrée/sortie, pour transmettre à ce shell l'enchainement des commandes avant de le fermer.
    Il ne faut pas lancer la commande "mount", mais une commande d'ouverture de shell ("bash", par exemple), et envoyer ensuite les différentes commandes et traiter les réponses du shell.

    Tu peux par exemple regarder et t'inspirer de la classe développée par adiguba (cf. une recherche dans le forum), gérant le lancement et l'interraction avec un process externe.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Points : 76
    Points
    76
    Par défaut
    Trsè intéressant comme piste...
    de là à dire que j'ai réussit, serait exagéré, mais ca me plain mieux...

    Voici ou j'en suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if (!System.getProperty("os.name").contains("Windows")) {
        StringBuilder out = new StringBuilder();
        StringBuilder err = new StringBuilder();
        Shell sh = new Shell();
     
        sh.command("sudo mount -a").error(err).output(out).consume();
        System.out.println("<OUTPUT>");
        System.out.println(out.toString());
        System.out.println("</OUTPUT>");
     
        System.out.println("<ERREOR>");
        System.out.println(err.toString());
        System.out.println("</ERREOR>");
     
    }
    Le problème est que cette commande m'envoie une erreur : [sudo] password for tomcat6:

    Vous imaginez bien que mon appli est executé sur tomcat avec le user tomcat6...
    Je vois pas trop comment passer le pwd, ou comment changer de user (avec un autre méthode ?)

    Merci d'avance !

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Comme je le disais dans mon post précédent, il faut passer un enchaînement de commande.

    Une fois ton shell ouvert, tu peux envoyer des commandes (le password, par exemple, quand il est demandé) sur l'inputStream du process.

    Le "sudo" par contre, me semble une mauvaise idée : le user Tomcat n'est certainement pas dans la liste des "sudoers".

    Je pencherais plutôt (cf. mon dernier post) sur l'ouverture d'un shell, puis l'enchaînement des commandes :
    - su
    - "saisie du mot de passe root"
    - mount -a
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    cyberchouan: il est préférable de mettre tomcat dans les sudoers autorisés à lancer mount -a, que d'encoder le mot de passe root dans le config de tomcat. Sauf si tu aime te faire etripper par les sysadmin lors du passage en production.

    D'autant que un bon fichier sudoers qui te limite à mount, combiné à une option dedans qui précise que le user tomcat n'a pas besoin de s'authentifier devrait faire l'affaire.

  6. #6
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    cyberchouan: il est préférable de mettre tomcat dans les sudoers autorisés à lancer mount -a, que d'encoder le mot de passe root dans le config de tomcat. Sauf si tu aime te faire etripper par les sysadmin lors du passage en production.
    J'appouve effectivement, si c'est pour une solution professionnelle.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    cyberchouan: il est préférable de mettre tomcat dans les sudoers autorisés à lancer mount -a, que d'encoder le mot de passe root dans le config de tomcat. Sauf si tu aime te faire etripper par les sysadmin lors du passage en production.

    D'autant que un bon fichier sudoers qui te limite à mount, combiné à une option dedans qui précise que le user tomcat n'a pas besoin de s'authentifier devrait faire l'affaire.
    J'approuve la démarche !
    J'avais testé cela, mais n'avait pas la connaissance de ce fichier de limitation pour la cmd sudo !

    Je passe en phase d'essai et vous tiens au courant.
    Merci

Discussions similaires

  1. console linux sous java
    Par ach152 dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 09/02/2009, 10h27
  2. exécute des commande unix sous java
    Par hbar01 dans le forum Général Java
    Réponses: 6
    Dernier message: 04/11/2008, 20h33
  3. Excécuter une commande Dos sous Java
    Par mina86 dans le forum Général Java
    Réponses: 2
    Dernier message: 31/05/2008, 12h01
  4. console linux sous java
    Par ach152 dans le forum Linux
    Réponses: 7
    Dernier message: 18/05/2008, 17h54
  5. commande dos sous java
    Par yann999 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 12/05/2006, 14h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo