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

Langage Perl Discussion :

Script Perl sous Windows exécutant du code sous UNIX


Sujet :

Langage Perl

  1. #21
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 583
    Points : 2 031
    Points
    2 031
    Par défaut
    Citation Envoyé par djibril Voir le message
    Elle ressemble à quoi tes commandes vers ta base?
    Je comprends pas en quoi windows pose un souci
    En Perl habituellement, on envoie une requète FQM (un pote à SQL ) à notre BDD comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("dmfqm", "db=my.database", "proc=fichierRequeteFQM" ,"aids=no", "uid=user", "upw=password");
    J'ai tenté de retranscrire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd	   => ["dmfqm", "db=my.database", "proc=fichierRequeteFQM" ,"aids=no", "uid=user", "upw=password"],
    ou encore comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd	   => ["dmfqm db=my.database proc=fichierRequeteFQM  aids=no  uid=user upw=password"],
    Ni l'un ni l'autre ne fonctionne et je n'ai aucun retour d'erreur, malgré la pragma 'warnings' utilisée.

    Edit : je pense rester sur ma dernière idée. Ainsi, mon script utilisant Net::SSH2 ne fera qu'envoyer un ordre d'exécution à un script Perl tiers, lequel fera tout le boulot de son côté de manière autonome.

    Là, j'avoue ne pas avoir épluché la doc de Net::SSH2 mais je ne vois rien permettant d'activer un quelconque mode d'affichage d'erreurs.

    Ca me botte pas de faire bosser un programme dont j'ignore s'il fait ou non le boulot

  2. #22
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 583
    Points : 2 031
    Points
    2 031
    Par défaut
    Bon. Je pense que je dois buter sur un problème lié à la sécurité car mon script sous Windows utilisant Net::SSH2 demande l'exécution du script 'toto.pl', lequel est stocké sur Unix et dont le contenu est on ne peut plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/usr/bin/perl
    system("dmfqm", "db=my.database", "proc=FichierRequete.prc" ,"aids=no", "uid=user", "upw=password");
    system("cat /DOC/bdd/programme/CHBO/FichierRequete.prc | mail -s \'TOTOPOUET\' mon.mail\@machin.org");
    Brièvement :

    Le 1er appel system déclenche une connexion dans la bdd, lui donne un fichier FichierRequete.prc contenant toutes les commandes SQL à traiter.
    Le 2eme appel system envoie par mail le fichier FichierRequete.prc à mon adresse mail du boulot.

    En lançant le traitement depuis le script sous Windows, seul le 2ème appel system fonctionne. Je reçois bien le mail mais le 1er appel system ne donne strictement rien.

    Si j'exécute à la main le script stocké sur Unix, il fait tout le boulot sans aucun soucis.

    Quelqu'un peut m'expliquer ?

  3. #23
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    open (STDERR, ">FichierErreur.txt");
    system("dmfqm db=my.database proc=FichierRequete.prc aids=no uid=user  upw=password") == 0 or print STDERR "Probleme avec system1 $! \n";
     
    sleep(5);
     
    system("cat /DOC/bdd/programme/CHBO/FichierRequete.prc | mail -s \'TOTOPOUET\' mon.mail\@machin.org") == 0 or print STDERR "Probleme avec system2 $! \n";
     
    close(STDERR);
    Les messages d'erreurs seront stockés dans le fichier FichierErreur.txt.
    Ensuite, tu te l'envoies par email avec l'autre fichier

  4. #24
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 583
    Points : 2 031
    Points
    2 031
    Par défaut
    Merci de ton aide, Djibril et de ta patience à aider un vieux boulet comme moi

    J'ai rajouté ton code dans mon script sur Unix et voici ce que donne le contenu du fichier captant tout ce qui sort sur STDERR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Can't exec "dmfqm": A file or directory in the path name does not exist. at /DOC/bdd/programme/CHBO/toto.pl line 9.
    Probleme avec system1 A file or directory in the path name does not exist.
    L'appel system à la commande dmfqm ne fonctionne donc pas

    Ce qui est étrange, ce que la commande whois dmfqm sur Unix ne me dit pas où se trouve le binaire mais si, toujours en mode commande je tape 'dmfqm', ça fonctionne parfaitement

  5. #25
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    fait un locate dmfqm sur ton serveur unix

  6. #26
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 583
    Points : 2 031
    Points
    2 031
    Par défaut
    Citation Envoyé par djibril Voir le message
    fait un locate dmfqm sur ton serveur unix
    locate ne donne rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     >locate dmfqm
    ksh: locate:  not found
    Par contre, which me donne ce chemin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     >which dmfqm
    /opt/basis/dm/bin/dmfqm
    J'ai rajouté le chemin complet dans l'appel system 1 et voici le contenu du fichier d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    exec(): 0509-036 Cannot load program /opt/basis/dm/bin/dmfqm because of the following errors:
    	0509-150   Dependent module libdmlib.a(dmlib.o) could not be loaded.
    	0509-022 Cannot load module libdmlib.a(dmlib.o).
    	0509-026 System error: A file or directory in the path name does not exist.
    Probleme avec system1
    Je suis dans l'caca je crois

  7. #27
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    si tu fais une commande de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("cd /opt/basis/dm/bin/ \&\& dmfqm db=my.database proc=FichierRequete.prc aids=no uid=user  upw=password") == 0 or print STDERR "Probleme avec system1 $! \n";

  8. #28
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    sinon FichierRequete.prc est un fichier dans lequel il y a des requêtes SQL?
    C'est une base de données mysql?
    Peux tu nous montrer quelques lignes de ce fichier SQL.
    Tu pourrais au pire des cas, une fois que j'aurais vu ton fichier, rajouter dans ton script perl du code pour lire ce fichier et exécuter les commandes SQL dans la BD.

  9. #29
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 583
    Points : 2 031
    Points
    2 031
    Par défaut
    Citation Envoyé par djibril Voir le message
    si tu fais une commande de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("cd /opt/basis/dm/bin/ \&\& dmfqm db=my.database proc=FichierRequete.prc aids=no uid=user  upw=password") == 0 or print STDERR "Probleme avec system1 $! \n";
    Ca ne fonctionne pas davantage, le message d'erreur est d'ailleurs plus court : dmfqm not found.

    Citation Envoyé par djibril Voir le message
    sinon FichierRequete.prc est un fichier dans lequel il y a des requêtes SQL?
    C'est une base de données mysql?
    Peux tu nous montrer quelques lignes de ce fichier SQL.
    Te montrer le contenu du fichier ne servirait pas à grand chose car ce n'est pas du SQL comme langage mais du FQM, un langage procédural proche d'un langage de programmation (il gère fort bien les if then else) mais malheureusement, aucune librairie n'a été écrite pour le rendre exploitable avec Perl autrement qu'en faisant des appels system à dmfqm.

    Si tu veux voir à quoi ressemble le fichier, en voici le contenu. Je l'ai allégé pour juste lui demander de créer son fichier de sortie, il se contente de se connecter à la bdd, de créer le fichier et c'est tout :

    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
    on/exception ERR
    on/syntax ERR
    sh/time
    set/mode echoproc=no
    start/transaction sr=BIBLIO
    open/file /DOC/bdd/programme/CHBO/resultat10.txt, FID=A, recordlc=4096, create=yes, intent=write
     
    *** QUESTIONS FQM supprimées pour le moment
     
    put/file, FID=A 'test d ecriture dans le fichier de sortie'
     
    close/file FID=A
    finish/transaction
    tell'finish/transaction'
    sh/time
    exit
    ERR:
    set/pv NOERR=!dmstat!
    set/mode echoproc=yes
    abort/trans, err=$continue
    show/message !NOERR!
    exit

  10. #30
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut

    bon en ligne de commande sous console unix, tu arrives à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /opt/basis/dm/bin/dmfqm db=my.database proc=FichierRequete.prc aids=no uid=user  upw=password
    ?

  11. #31
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 583
    Points : 2 031
    Points
    2 031
    Par défaut
    Citation Envoyé par djibril Voir le message

    bon en ligne de commande sous console unix, tu arrives à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /opt/basis/dm/bin/dmfqm db=my.database proc=FichierRequete.prc aids=no uid=user  upw=password
    ?
    C'est ça le bin's : OUI, j'y arrive !

    Je n'ose même plus regarder mon micro

  12. #32
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon quand tu lance ton script depuis windows, Dans ce script, tu fais une connexion ssh avec un login qui a les bon droits?

  13. #33
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 583
    Points : 2 031
    Points
    2 031
    Par défaut
    Citation Envoyé par djibril Voir le message
    Bon quand tu lance ton script depuis windows, Dans ce script, tu fais une connexion ssh avec un login qui a les bon droits?
    Dans mon script "windows", j'utilise le même identifiant qu'avec la console telnet de windows. L'envoi du mail depuis Aix fonctionne, preuve que j'arrive à me connecter.

    Dans mon script "unix", j'utilise le même identifiant que d'habitude pour me connecter à la bdd. Exécuter ce script en mode commande sans passer par le script Windows fonctionne.

    Bref, c'est un casse tête

    Et je viens d'essayer toute autre chose en utilisant Net::Telnet à la place de Net::SSH2. J'arrive à lancer des commandes simples du genre "who", "whoami" depuis Windows vers Aix mais l'envoi d'un pauvre mail et j'ai droit illico à un timeout. Idem si je veux exécuter le script "unix" dont nous parlons depuis hier : timeout.

  14. #34
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    argfffffff on va finir par trouver

  15. #35
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 583
    Points : 2 031
    Points
    2 031
    Par défaut
    En me basant sur un test réalisé via l'emploi de Net::Telnet :

    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
    use strict;
    use warnings;
    use Net::Telnet;
     
    my $prompt ='/.*[\>] *$/';
     
    my $t = new Net::Telnet (
    	Host	=> "aix.dev",
    	Timeout => 10,
    	Prompt 	=> $prompt);
    $t->login("user", "password");
     
    foreach("whoami", "who", "pwd", "perl -v", "perl -e \'use totopouet\'")
    {
    	my @temp = $t->cmd($_);
    	print "Résultat de la commande \'$_\' -> @temp\n";
    }
    exit();
    Le but de la manip est de vérifier si l'exécution à distance de certaines commandes fonctionne depuis Windows vers AIX.

    A noter que le dernier élément de la liste des commandes à faire exécuter renvoie vers un nom de module perl "totopouet" n'existant pas. Je souhaitais ici récupérer avec certitude le message d'erreur du compilo de Perl.

    Ca marche parfaitement et je récupère bien tout à la fin le message d'erreur du compilo ne trouvant pas dans @INC le moindre module totopouet.pm.

    Je ne le montre pas dans le code mais la commande "cd" fonctionne également (un test après 'cd' via commande 'pwd' me le confirme) mais dès que je demande à ce bout de script d'exécuter le programme toto.pl dont on parle depuis le début (celui se connectant à la bdd puis envoyant un mail) et ça ne va pas au bout.

  16. #36
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon, bah j'espere que ça va fonctionner alors!!

  17. #37
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 583
    Points : 2 031
    Points
    2 031
    Par défaut
    CA MARCHE !!!!!!!!!!

    Alors, pour résumer, je dirais que :

    - le module Net::SSH2 est fort capricieux avec la bdd que nous avons au boulot
    - Net::Telnet n'aime pas que l'on ouvre le canal STDERR en écriture dans un script exécuté à distance
    - Net::Telnet parvient toutefois à dialoguer avec la bdd

    Bref, c'est assez bizarre, isn'it ?

    Encore un gros merci à toi, Djibril, et aussi grand merci pour les très bons tutoriels et cours de formation pour apprendre Perl : http://perl.developpez.com/cours/

  18. #38
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Exécution de JCL sous Windows ou Unix
    Par al1_24 dans le forum JCL - SORT
    Réponses: 3
    Dernier message: 23/07/2007, 20h33
  2. [EasyPHP] Je n'arrive plus à exécuter mon code
    Par nath-0-0 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 22/08/2006, 16h57
  3. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  4. Compiler un code sous windows
    Par KORTA dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 30/09/2003, 16h53
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

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