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

API standards et tierces Java Discussion :

[Système][Runtime] lancer une commade avec un PIP


Sujet :

API standards et tierces Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 4
    Points
    4
    Par défaut [Système][Runtime] lancer une commade avec un PIP
    En effet je dois lancer une commande avec un PIP de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo toto | gpg --option blaba
    .


    il m'affiche à la console :
    toto | gpg --option blaba
    ça ne marche pas

    ce qui veut dire il ignore le " | " et il execute que la commande "echo". je c pas comment faire pourqu'il puisse le prendre en compte.

    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 304
    Points : 348
    Points
    348
    Par défaut
    Quel est le rapport avec java? Tu l'exécutes à partir d'une classe ta commande?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    bien evidement, sinon je ne devrais pas mettre RUNTIME comme tag de titre.

    Je c que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process p=getRuntime().exec("commande");
    mais dans la commande si tu as un PIP, il ne fait rien ou il execute la premiere instruction et il ignore l'instruction après le pip "| ...."


    Merci d'avance

  4. #4
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    Il me semble que le pipe est une "fonction" mise à disposition par le shell, donc si tu fais une commande du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /bin/bash -c "echo toto | gpg --option blaba"
    Ca devrait le faire

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    merci pour l'aide mais ça ne fait rien avec ma méthode, il affiche rien (mais par contre elle marche sur la consol unix).

    ma commande :
    /bin/bash -c " echo FFLKHGFD | /gnupg-1.2.3/bin/gpg --no-tty --passphrase-fd 0 --no-secmem-warning --passphrase-fd 0 --output sotiefile --decrypt entreefile"

    Ma méthode :

    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
    21
    22
    23
    24
    25
    26
    27
     
    public void deCrypte(String pgpass,String entree, String sortie) {
    		log.info(" -----------> DEBUT DU DECRYPTAGE <-----------");
    		try {
     
    			String  commande= "/bin/bash -c \"echo "+pgpass+" | /gnupg-1.2.3/bin/gpg --no-tty --passphrase-fd 0  --no-secmem-warning --passphrase-fd 0 --output "+sortie+" --decrypt "+entree+"\"";
    			log.debug("LA COMMANDE : "+commande);
    			Process p=run.exec(commande);
    			OutputStream in=p.getOutputStream();
    		    in.write("".getBytes());
    		    in.flush();
    		    InputStream out=new BufferedInputStream(p.getInputStream());
    		    byte[] b=new byte[1024];
    		    int    n=out.read(b);
    		    String st="";
    		    for(int i=0;i<n;i++) st=st+(new Character((char)b[i])).toString();
    		    log.info("");
    		    log.debug(st);
    		    log.info("");
    			p.destroy();
    			log.info(" -----------> FIN DU DECRYPTAGE <-----------");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			log.debug("Problème pendant l'execution de la commande de décryptage :\r\n"+e);
    		}
    	}

    resultat après execution :
    INFO [19/08/2005-11:20:20] : Cryptor [deCrypte] [83] - -----------> DEBUT DU DECRYPTAGE <-----------
    DEBUG [19/08/2005-11:20:20] : Cryptor [deCrypte] [87] - LA COMMANDE : /bin/bash -c "echo PdLcNaP2002 | /gnupg-1.2.3/bin/gpg --no-tty --passphrase-fd 0 --no-secmem-warning --passphrase-fd 0 --output /tmp/message.text --decrypt /tmp/message.text.pgp"
    INFO [19/08/2005-11:20:20] : Cryptor [deCrypte] [97] -
    DEBUG [19/08/2005-11:20:20] : Cryptor [deCrypte] [98] -
    INFO [19/08/2005-11:20:20] : Cryptor [deCrypte] [99] -
    INFO [19/08/2005-11:20:20] : Cryptor [deCrypte] [101] - -----------> FIN DU DECRYPTAGE <-----------

  6. #6
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Il faut séparer la commande des paramètres quand tu fais un exec() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exec(new String[] {"/bin/bash", "-c \"echo .....\""});

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    ça n'a pas changer mon resultat, il ne fait toujours rien.

    Merci

  8. #8
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Il ne faut pas utiliser les pipes et les redirections dans une commande de la méthode getRuntime.

    Voir l'article When Runtime.exec() won't

    En plus d'aprés mon expéricnce, il faut éviter d'utiliser la méthode getRuntime.

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par IVAGO
    ça n'a pas changer mon resultat, il ne fait toujours rien.
    Il faut séparer les arguments un à un (l'exemple de Wookai mélange deux arguments) et il ne faut pas mettre les chaînes entre quotes (elle sont interprété par le shell et non pas le programme...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Runtime.getRuntime().exec( new String[] {"/bin/bash",
    					"-c",
    					"echo "+pgpass+" | /gnupg-1.2.3/bin/gpg --no-tty --passphrase-fd 0  --no-secmem-warning --passphrase-fd 0 --output "+sortie+" --decrypt "+entree
    					} );
    De plus regarde le code de retour de ton process (exitValue())... En général une valeur différentes de 0 indique une erreur, mais elle ne provoquera pas d'exception (une exception n'est lancé que si le process n'a pas été lancé).

    Enfin ta manière de créer la String depuis un byte[] est vraiment bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    byte[] b=new byte[1024];
    int    n=out.read(b);
    String st="";
    for(int i=0;i<n;i++) st=st+(new Character((char)b[i])).toString();
    Si b comporte 1024 éléments valides, tu vas créer 1024 String !!!
    Alors qu'il suffit d'utiliser le constructeur adéquat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    byte[] b=new byte[1024];
    int    n=out.read(b);
    String st = new String(b,0,n);
    a++

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jowo
    Il ne faut pas utiliser les pipes et les redirections dans une commande de la méthode getRuntime.

    Voir l'article When Runtime.exec() won't
    Dans ce cas c'est possible car le pipe est passé au shell qui l'interprétera ensuite (ce n'est pas Java qui le gère)... Par contre ce n'est pas très portable...
    Par contre il est possible de le faire en Java en lancant deux process et en redirigeant la sortie de l'un dans l'entrée de l'autre... mais c'est plus complexe à gérer...

    Citation Envoyé par jowo
    En plus d'aprés mon expéricnce, il faut éviter d'utiliser la méthode getRuntime.
    Euh... pourquoi ???
    Il faut éviter d'appeller des programmes externes si on souhaite conserver une portabilitée... mais sinon on ne peut pas faire autrement...

    IVAGO >> Je viens de m'apercevoir que tu ne récupérait pas le flux d'erreur... tu ne peux donc pas connaitre le problème éventuelle...

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    j'ai bien fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Runtime.getRuntime().exec( new String[] {"/bin/bash",
                   "-c",
                   "echo "+pgpass+" | /gnupg-1.2.3/bin/gpg --no-tty --passphrase-fd 0  --no-secmem-warning --passphrase-fd 0 --output "+sortie+" --decrypt "+entree
                   } );
    Même chose, il n'affiche rien.

    En ce qui conserne ma boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for(int i=0;i<n;i++) st=st+(new Character((char)b[i])).toString();
    elle fonctionne correctement, je l'ai déjà testée avec plusieurs de mes classes.


    Merci d'avance.

  12. #12
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    Tu as oublié de mettre les doubles-quote autour de la commande que tu passes à bash :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Runtime.getRuntime().exec( new String[] {"/bin/bash",
                   "-c",
                   "\"echo "+pgpass+" | /gnupg-1.2.3/bin/gpg --no-tty --passphrase-fd 0  --no-secmem-warning --passphrase-fd 0 --output "+sortie+" --decrypt "+entree +"\""
                   } );
    Je suis un peu d'accord sur le fait que l'utilisation de l'exec peut mener à des mauvais programmes, en théorie on devrait pouvoir tout faire en Java sans avoir à passer par des programmes système ( ce qui implique comme le disait adiGuba un problème de portabilité ). Mais d'un autre coté, on est parfois confronté à un impératif de temps, et réinventer la poudre ça peut être très difficile aussi !

    Donc bon si son programme est destiné à tourner dans un environnement précis, c'est ok je pense d'utiliser les commandes systèmes

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Dès que j'ai vu qu'il ne fesait rien, j'ai mis les "\"" sur le troisième element du tableau de string mais malheurement ça n'a toujours pas changé le resultat obtenu il fait rien.


    Merci d'avance

  14. #14
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       OutputStream in=p.getOutputStream();
       in.write("".getBytes());
       in.flush();
    Je ne comprend pas pourquoi tu fais ça.
    Normalement, tu peux directement exploiter le OutputStream, et récupérer la sortie de ton process..
    Je comprend pas pourquoi tu utilises le InputStream aussi ?

    Essaie d'exploiter le OutputStream sans y écrire dedans, ça devrait déjà mieux fonctionner

  15. #15
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Je précise qu'il existe des API Java pour PGP.

    man gpg

    --no-tty
    Make sure that the TTY (terminal) is never used for any output. This option is needed in some cases because GnuPG sometimes prints warnings to the TTY if if --batch is used.

    --passphrase-fd 0

    --no-secmem-warning

    --passphrase-fd 0

    --output "sortie"
    Write output to file sortie

    --decrypt "+entree

    Mais dans ton programme, tu essaies de lire la sortie standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Process p=run.exec(commande); 
             OutputStream in=p.getOutputStream();
    Je ne comprends pas en plus tu as l'option no-tty qui force le programme a aucun cas de sortir des infos sur le terminal.

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Lire au dessus, la commande marche normalement, c le exec() de runtime qui n'arrive pas executé la commande.

    mrici d'avance.

  17. #17
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par IVAGO
    elle fonctionne correctement, je l'ai déjà testée avec plusieurs de mes classes.
    Je n'ai pas dit que cela ne fonctionnait pas... mais que cela impliquait la création de nombreuses String intermédiaires alors qu'il existe un constructeur pour faire la même chose... Cela peut être très couteux en performances si c'est utilisée trop souvent (le garbage collector passe son temps à allouer/désallouer de la mémoire).

    Citation Envoyé par adiGuba
    IVAGO >> Je viens de m'apercevoir que tu ne récupérait pas le flux d'erreur... tu ne peux donc pas connaitre le problème éventuelle...
    Est-ce que tu as essayé d'afficher le flux d'erreur ?


    Citation Envoyé par jowo
    Je précise qu'il existe des API Java pour PGP.
    Cette solution ne te convient pas ?

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    J'ai contourné la situation : en effet je créé un fichier script en java avec le contenu de ma commande.puis je lance dans ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Process p=run.exec("chmod +x "+script);
     Process p2=run.exec("sh "+script);
     Process p3=run.exec("ls -l");
    resultat :

    INFO [2005-08-19:15-37-01] : toto [deCrypte] [86] - -----------> DEBUT DU DECRYPTAGE <-----------
    DEBUG [2005-08-19:15-37-01] : toto [deCrypte] [90] - LA COMMANDE : /bin/bash -c "echo HFDSKLTRE |/gnupg-1.2.3/bin/gpg --no-tty --passphrase-fd 0 --no-secmem-warning --passphrase-fd 0 --output /tmp/message.txt --decrypt /tmp/message.txt.pgp"
    log4j:WARN No appenders could be found for logger (root).
    log4j:WARN Please initialize the log4j system properly.
    INFO [2005-08-19:15-37-03] : toto [deCrypte] [117] -
    DEBUG [2005-08-19:15-37-03] : toto [deCrypte] [118] -
    DEBUG [2005-08-19:15-37-03] : toto [deCrypte] [119] -
    DEBUG [2005-08-19:15-37-03] : toto [deCrypte] [120] - total 4
    -rw-r--r-- 1 w4adm w4 570 ao? 19 15:34 /tmp/message.txt.pgp
    -rwxr-xr-x 1 w4adm w4 271 ao? 19 15:37 script

    INFO [2005-08-19:15-37-03] : toto [deCrypte] [121] -
    INFO [2005-08-19:15-37-03] : toto [deCrypte] [128] - -----------> FIN DU DECRYPTAGE <-----------
    Mais quand mais quand je retape manuellement ls -l, il affiche :


    total 6
    -rw-r--r-- 1 w4adm w4 380 aoû 19 15:37 /tmp/message.txt
    -rw-r--r-- 1 w4adm w4 570 aoû 19 15:34 /tmp/message.txt.pgp
    -rwxr-xr-x 1 w4adm w4 271 aoû 19 15:37 script
    je retrouve bien le fichier décripté c bizarre !!!

    peut être j'oublie quelque chose

    Merci d'avance

  19. #19
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    Peut-être dois-tu attendre la fin du premier process, pour faire ton ls.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2006, 09h30
  2. Lancer une Fenetre avec une taille precise
    Par K.othmane dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 23/02/2006, 19h52
  3. [Runtime]lancer une application externe
    Par biozaxx dans le forum Général Java
    Réponses: 3
    Dernier message: 09/11/2005, 17h13
  4. [Système][Runtime]lancer une application externe
    Par mencaglia dans le forum API standards et tierces
    Réponses: 14
    Dernier message: 22/09/2005, 17h27
  5. [FLASH MX2004] Lancer une anim avec des paramètres ??
    Par gchanteux dans le forum Flash
    Réponses: 4
    Dernier message: 23/03/2005, 17h49

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