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 :

Comportement capture QX


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut Comportement capture QX
    Bonjour,

    je cherche à tester des ouvertures de ports sur des équipements via la commande UNIX/LINUX "nc"'.
    Je ne peux pas installer le module NET:ING.

    Le but est de lancer la commande avec des options dont des arruments qui sont des adresses IP venant d'un fichier tout en récupérant le résultant dans des scalar via la commande "qx" pour être traités par la suite.
    Les commandes se lancent. Le résultat s'affiche à l'écran mais je n'ai rien qui s'affiche dans la scalar $NC.
    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
     
    use strict;
    use warnings;
    use Data::Dumper;
    use feature 'say';
    no warnings 'uninitialized';
     
    my @all;
     
    open (my $SOURCE, "<", "$ARGV[0]") or die "Can't open < input.txt: $!";
     
    while (<$SOURCE>) {
    	chomp;
    	push @all, split (/\n/, $_);
    	}
     
    foreach my $IP (@all) {
    	my $NC = qx(nc -vz $IP 22-23);
    	print Dumper $NC;
    }
    Résultat:
    $ perl test.pl source.txt
    nc: connect to 127.0.0.1 port 22 (tcp) failed: Connection refused
    nc: connect to 127.0.0.1 port 23 (tcp) failed: Connection refused
    $VAR1 = '';
    nc: connect to 8.8.8.8 port 22 (tcp) failed: Connection timed out
    nc: connect to 8.8.8.8 port 23 (tcp) failed: Connection timed out
    $VAR1 = '';
    Connection to 6.91.128.139 22 port [tcp/ssh] succeeded!
    nc: connect to 6.91.128.139 port 23 (tcp) failed: Connection timed out
    $VAR1 = '';

    A première vu en regardant d'autres exemples, je devrais bien récupérer une valeur dans $NC.

    Serait la boucle qui pose un problème ?

    Si vous avez une idée

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    d'abord une remarque. Cette boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (<$SOURCE>) {
    	chomp;
    	push @all, split (/\n/, $_);
    }
    est un peu étrange: dans la mesure où l'instruction de boucle while (<$SOURCE>) divise le fichier source en lignes individuelle, le split sur la regex /\n/ ne peux guère splitter grand-chose. Tu devrais quand même récupérer le contenu de la ligne, mais ce n'est peut-être pas ce que tu souhaites (je ne peux en juger, car tu n'as pas montré le contenu du fichier en entrée).

    Ensuite, pour essayer de comprendre ce qui se passe, tu devrais imprimer le contenu de la variable $IP juste avant l'instruction qx/nc .../. Cela permettra de savoir ce que tu passes exactement à la commande nc. Ensuite, essaie de lancer depuis le prompt du shell la commande nc avec les paramètres que tu lui passes, pour voir ce qu'elle retourne exactement.

    A noter que les messages d'erreur que tu reçois sont envoyés très certainement sur la sortie d'erreur (STDERR) en ne sont donc pas récupérés par le commande qx/.../ qui ne récupère que la sortie standard (STDOUT). Si ta commande nc (sous Linux) n'envoie rien sur la sortie standard, alors il est normal que qx/.../ ne récupère rien. Pour être sûr de ce que la commande nc depuis l'invite du shell renvoie sur la sortie standard, tu peux rediriger la sortie d'erreur vers un fichier ou vers /dev/null, par exemple avec une commande Linux du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nc -vz $IP 22-23 2>/dev/null
    (en supposant que $IP est une variable d'environnement contenant l'une de tes adresses IP). Il n'y aura alors plus que la sortie standard qui s'affichera à l'écran.

    Je pense que tu découvriras que ta commande nc ne renvoie rien vers la sortie standard parce que la commande échoue probablement. Si ça n'est pas le cas, alors montre nous ce que cette commande Linux t'affiche. Et si c'est le cas, alors c'est un problème Linux, pas du tout un problème Perl.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    Bonsoir Lolo,

    Effectivement, j'ai simplifié la boucle while.

    Bien vu, c'est bien parce que les message sont des SDTERR (c'est piégeur ca vu que on le voit à l'écran) que je ne retrouve rien dans ma variable tiré de qx.

    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
    use strict;
    use warnings;
    use Data::Dumper;
    use feature 'say';
    no warnings 'uninitialized';
     
    my @all;
     
    open (my $SOURCE, "<", "$ARGV[0]") or die "Can't open < input.txt: $!";
     
    while (<$SOURCE>) {
    	chomp;
    	push @all, $_;
    	}
     
    foreach my $IP (@all) {
    	my $NC = qx(nc -vz $IP 22-23 2>/dev/null);
    	print Dumper $NC;
    }
    Résultat:
    $VAR1 = '';
    $VAR1 = '';
    $VAR1 = '';

    Ce soir je n'ai pas le temps de regarder comment tout récupérer, je ferais des recherches demain.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    Après plusieurs test, je bloque pour pour afficher le comportement normal et récupérer dans une variable le STDOUT et STDERR dans une même variable.

    le fichier source.txt
    127.0.0.1
    8.8.8.8
    6.91.128.139
    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
     
    use strict;
    use warnings;
    use Data::Dumper;
    use feature 'say';
    no warnings 'uninitialized';
     
    my @all;
     
    open (my $SOURCE, "<", "$ARGV[0]") 	or die "Can't open < input.txt: $!";
     
    while (<$SOURCE>) {
    	chomp;
    	push @all, $_;
    	}
     
    	foreach my $IP (@all) {
    	my $output = qx(nc -vz $IP 22 2>&1);
    	print Dumper $output;
    	}
     
    close $SOURCE;
    RESULTAT
    $ perl test.pl source.txt
    $VAR1 = 'nc: connect to 127.0.0.1 port 22 (tcp) failed: Connection refused
    ';
    $VAR1 = 'nc: connect to 8.8.8.8 port 22 (tcp) failed: Connection timed out
    ';
    $VAR1 = 'Connection to 6.91.128.139 22 port [tcp/ssh] succeeded!
    ';
    Deux problème, je n'ai plus la sortie standard et la commande push produit des erreurs.

    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
    my @all;
     
    open (my $SOURCE, "<", "$ARGV[0]") 	or die "Can't open < input.txt: $!";
     
    while (<$SOURCE>) {
    	chomp;
    	push @all, $_;
    	}
     
    	foreach my $IP (@all) {
    	my $output = qx(nc -vz $IP 22 2>&1);
    	print Dumper $output;
    	push @all, $output;
    	}
     
    print for "@all";	
     
    close $SOURCE;

    $ perl test.pl source.txt
    $VAR1 = 'nc: connect to 127.0.0.1 port 22 (tcp) failed: Connection refused
    ';
    $VAR1 = 'nc: connect to 8.8.8.8 port 22 (tcp) failed: Connection timed out
    ';
    $VAR1 = 'Connection to 6.91.128.139 22 port [tcp/ssh] succeeded!
    ';
    sh: -c: ligne 0: erreur de syntaxe près du symbole inattendu « ( »
    sh: -c: ligne 0: `nc -vz nc: connect to 127.0.0.1 port 22 (tcp) failed: Connection refused'
    $VAR1 = '';
    sh: -c: ligne 0: erreur de syntaxe près du symbole inattendu « ( »
    sh: -c: ligne 0: `nc -vz nc: connect to 8.8.8.8 port 22 (tcp) failed: Connection timed out'
    $VAR1 = '';
    nc: port numb
    On dirait que $output n'a pas copié des résultats mais chercher à passer des commandes.

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Et tu obtiens quoi quand tu essaies chacune des commandes suivantes à la ligne de commande du shell:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nc -vz 8.8.8.8 22 2>&1
    nc -vz 8.8.8.8 22 2>/dev/null
    nc -vz 6.91.128.139 22 2>&1
    nc -vz 6.91.128.139 22 2>/dev/null

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    Voici les retours :

    Seul 2>&1 apporte un résultat.

    wsfs6503@EB-PC02KXES ~/SCRIPT
    $ nc -vz 8.8.8.8 22 2>&1
    nc: connect to 8.8.8.8 port 22 (tcp) failed: Connection timed out

    wsfs6503@EB-PC02KXES ~/SCRIPT
    $ nc -vz 8.8.8.8 22 2>/dev/null

    wsfs6503@EB-PC02KXES ~/SCRIPT
    $ nc -vz 6.91.128.139 22 2>&1
    Connection to 6.91.128.139 22 port [tcp/ssh] succeeded!

    wsfs6503@EB-PC02KXES ~/SCRIPT
    $ nc -vz 6.91.128.139 22 2>/dev/null

    wsfs6503@EB-PC02KXES ~/SCRIPT

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Free Pascal] Comportement de Exec
    Par néo333 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 01/11/2003, 18h46
  2. Réponses: 10
    Dernier message: 10/10/2003, 15h25
  3. Réponses: 2
    Dernier message: 22/09/2003, 12h23
  4. Capture d image par webcam
    Par moimoimoi3x dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/07/2003, 09h48
  5. Réponses: 3
    Dernier message: 01/11/2002, 15h30

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