Probleme script avec PERL

Fermé
Scrathi - 16 mars 2010 à 13:42
 scrathi - 17 mars 2010 à 14:39
Bonjour, c'est le premier script en Perl que je fait et j'ai un peu de mal avec ,
je dois faire un script qui se connecte sur les equipement en telenet pour prendre le fichier de log.
voici le script Pas fini mais j'ai deja des erreur :(
#!/usr/bin/perl -w
use strict;
use warnings;
my $i;
my $choix;
my $nom;
my $ip;
my $telnet;
my $username="admin";
my $passwd="motsdepasse";
unshift(@INC,"C:/Perl/lib");
use Net::Telnet;
my $HOST=('$ip');
my $HOSTS=('$nom');
 
do 
{
print "vous voulez recherche par nom ou Par adresse Ip ?\n";
print "nom=1 et Adresse Ip=2 Quitter=3\n";
print"choix:";
$choix=<STDIN>;

if( $choix == 1 )
{
	print"vous avez fait le choix 1 \n";
	print"Saisir un nom : ";
	$nom=<STDIN>;
	$telnet->open($HOSTS);
	$telnet->login($username, $passwd);
}
elsif( $choix == 2 )
{ 
	print"vous avez fait le choix 2\n";
	print"saisir une adresse IP :";
	$ip=<STDIN>;
	$telnet->open($HOST);
	$telnet->login($username, $passwd);
}
else
{
	print"vous avez fait aucun choix \n";

}
} until( $choix==3);


et donc apres je sais pas comment faire pour les corriger et il faut que je finise aussi les parti qui concerne les log ..

si vous pourriez m'aider ca serai tres sympa de votre part merci !
A voir également:

11 réponses

blux Messages postés 26020 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 3 mai 2024 3 289
16 mars 2010 à 13:50
Salut,

et c'est quoi les erreurs ? A quelles lignes ?
0
oui , effectivement j'ai etait tellement pris pas la programme que j'en est oublier les erreur ...

http://img704.imageshack.us/img704/2742/pdu.jpg en image ^^

sinon l'erreur il me dit can't call method "open" on undefined value et apres le chemin du lien
0
Scrathi > scrathi
16 mars 2010 à 14:10
il me semble que tout simplement je lui est pas donner de valeur en faite :( pour ca qu'il ne marche pas :( je lui est dit de prend $host mais je donne aucune valeurs ..
0
Scrathi > Scrathi
16 mars 2010 à 15:42
bonjour j'ai un autre probleme la ,

je viens de rajouter des choses :( mais tjr autant de probleme que je ne connais pas
#!/usr/bin/perl -w
use strict;
use warnings;
my $i;
my $choix;
my $nom;
my $ip;
my $telnet;
my $username="admin";
my $passwd="motsdepasse";
unshift(@INC,"C:/Perl/site/lib");
use Net::Telnet;
use Net::SNMP;
my $HOST=('$ip');
my $HOSTS=('$nom');
my $snmp_port = 161;
my $oid = « 1.3.6.1.4.1.318.1.1.12.1.5, 1.3.6.1.4.1.318.1.1.12.1.1 »;
my $host = « $ip »;
my $community = « private » 
my ($session, $error) = Net::SNMP->session(-hostname = $host,-timeout = 3,-retries = 1,-community = $community,-port = $snmp_port);
do 
{
print "vous voulez recherche par nom ou Par adresse Ip ?\n";
print "nom=1 et Adresse Ip=2 Quitter=3\n";
print"choix:";
$choix=<STDIN>;

if( $choix == 1 )
{
	print"vous avez fait le choix 1 \n";
	print"Saisir un nom : ";
	$nom=<STDIN>;
	$telnet->open($HOSTS);
	$telnet->login($username, $passwd);
	@ $oid 
	
	
}
elsif( $choix == 2 )
{ 
	print"vous avez fait le choix 2\n";
	print"saisir une adresse IP :";
	$ip=<STDIN>;
	$telnet->open($HOST);
	$telnet->login($username, $passwd);
	@ $oid
	}
else
{
	print"vous avez fait aucun choix \n";

}
} until( $choix==3);
 


unrecognized charater \xAB ligne 17 ..

merci de m'aider .
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
16 mars 2010 à 15:46
Salut,

my $oid = « 1.3.6.1.4.1.318.1.1.12.1.5, 1.3.6.1.4.1.318.1.1.12.1.1 »;
my $host = « $ip »;

Utilise des guillemets
my $oid = "1.3.6.1.4.1.318.1.1.12.1.5, 1.3.6.1.4.1.318.1.1.12.1.1";
my $host = $ip;
0
Merci , oui ça marche mieux effectivement une faute d'inattention , et comme c'est le premier pas beaucoup de rigueur mais ça me re-balance sur une autre erreur ..

global symbol"$sessions" requires explicit package name ligne 20
global symbol"$error" requires explicit package name ligne 20

Donc je leur attribué une variable
my $session;
my $error;

et donc il me fait ca actuellement syntax error at line near "my"

donc je comprend pas du tout ...
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
16 mars 2010 à 20:14
Salut,

Lance ton script avec la commande
perl -cx tonscript.pl
et ensuite colle ici le résultat
0
merci mai s'etait une faute de syntaxe que je n'avais pas vu .

mais la je suis encore bloquer jamais deux sans 3... :(

j'ai active perl 5.10

le net snmp c'est installer daans le fichier cpan

mais quand je lance il me dit
can't locate NET/SNMP.pm in @inc mais quand je regarde le SNMP.pm est bien dedans ... et fait reference a la ligne 13..
#!/usr/bin/perl -w
use strict;
use warnings;
my $i;
my $choix;
my $nom;
my $ip;
my $telnet;
my $username="admin";
my $passwd="motsdepasse";
use lib "C:/Perl/site/lib";
use Net::Telnet;
use Net::SNMP;
my $HOST=('$ip');
my $HOSTS=('$nom');
my $snmp_port = 161;
my $oid = " 1.3.6.1.4.1.318.1.1.12.1.5, 1.3.6.1.4.1.318.1.1.12.1.1 ";
my $host = $ip ;
my $community = " private ";
my ($session, $error) = Net::SNMP->session(-hostname => $host,-timeout => 3,-retries => 1,-community => $community,-port => $snmp_port);
do 
{
print "vous voulez recherche par nom ou Par adresse Ip ?\n";
print "nom=1 et Adresse Ip=2 Quitter=3\n";
print"choix:";
$choix=<STDIN>;

if( $choix == 1 )
{
	print"vous avez fait le choix 1 \n";
	print"Saisir un nom : ";
	$nom=<STDIN>;
	$telnet->open($HOSTS);
	$telnet->login($username, $passwd);
}
elsif( $choix == 2 )
{ 
	print"vous avez fait le choix 2\n";
	print"saisir une adresse IP :";
	$ip=<STDIN>;
	$telnet->open($HOST);
	$telnet->login($username, $passwd);
}
else
{
	print"vous avez fait aucun choix \n";

}
} until( $choix==3);
 

que faire :( ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 mars 2010 à 11:12
Salut,

Tu es sur quelle distribution Linux?

mais quand je regarde le SNMP.pm est bien dedans ..
Tu devras dire plus. Tu regarde où? Dans quel répertoire?

Donne le chemin complet de ton module pm
0
en faite je sais que c'est pas bien mais je suis sur windows ....
mais c'était un beuge j'ai redemarer la machine et c'est passer va savor pourquoi -_-'
donc il le prend bien en compte maitenant et tout les fichier son present ...

merci de tes réponses, et tu temps passer a me repondre

mais j'aurai encore besoin de soliciter tes conseil

j'arrive a lancer mon programme mais au debut il me dit que "Use of uninitialized value $host in substitution (s///) IPV4.pm ligne 64

Use of uninitialized value $host in substitution (s///) IPv4 ligne 72

c'est mon premier script et je connais pas tres bien , mais je comprend pas pourtant je lui est attribue une valeur dans le scripts
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 mars 2010 à 11:26
Re,

Affiche les lignes concernées. Merci.
0
Ce deux ligne son tissu du fichier IPV4

  my $serv = ($host =~ s/:([\w\(\)\/]+)$//) ? $1 : undef;

elle me dit comme erreur "Use of Uninitialized value $host in substitution (s///)


  if (!defined ($nh->{addr} = inet_aton($_[1] = $host))) {

Use of Uninitialized value in subroutine entry at (s///)

est ce qu'il y aurai conflit entre les deux $host de mon script et celle du fichieer IPV4 ?

parce qu'il se lance quand meme
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 mars 2010 à 11:54
Re,

Mets en commentaire la ligne avec s/// et fait un
print "host => $host\n";
0
je peux pas modifier le fichier ipv4.pm a moins que j'en recre un et que je fasse ca .

et le print "host => $host\n";

je le fait sur mon script ?

package Net::SNMP::Transport::IPv4;
use strict;

use Net::SNMP::Transport;

use IO::Socket qw(
   INADDR_ANY INADDR_LOOPBACK inet_aton PF_INET sockaddr_in inet_ntoa
);

our $VERSION = v1.0.0;

sub _socket_create
{
   my ($this) = @_;

   return IO::Socket->new()->socket($this->_protocol_family(),
                                    $this->_protocol_type(),
                                    $this->_protocol());
}

sub _protocol_family
{
   return PF_INET;
}

sub _addr_any
{
   return INADDR_ANY;
}

sub _addr_loopback
{
   return INADDR_LOOPBACK;
}

sub _hostname_resolve
{
   my ($this, $host, $nh) = @_;

   $nh->{addr} = undef;

  # my $serv = ($host =~ s/:([\w\(\)\/]+)$//) ? $1 : undef;   <- celle la qui est avec les s/// 

   if (defined($serv) && (!defined $this->_service_resolve($serv, $nh))) {
      return $this->_error('Failed to resolve the %s service', $this->type());
   }

   if (!defined ($nh->{addr} = inet_aton($_[1] = $host))) {   <- l'erreur subroutine
      return $this->_error(
         q{Unable to resolve the %s address "%s"}, $this->type(), $host
      );
   }

   return $nh->{addr};
}

sub _name_pack
{
   return sockaddr_in($_[1]->{port}, $_[1]->{addr});
}

sub _address
{
   return inet_ntoa($_[0]->_addr($_[1]));
}

sub _addr
{
   return (sockaddr_in($_[1]))[1];
}

sub _port
{
   return (sockaddr_in($_[1]))[0];
}

sub _taddress
{
   return sprintf '%s:%d', $_[0]->_address($_[1]), $_[0]->_port($_[1]);
}

sub _taddr
{
   return $_[0]->_addr($_[1]) . pack 'n', $_[0]->_port($_[1]);
}
1; # [end Net::SNMP::Transport::IPv4]
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 mars 2010 à 12:24
Re,

Je ne parle pas de toucher au module.
En regardant un peu plus ton code je vois des anomalies au début de script

my $HOST=('$ip');
my $HOSTS=('$nom');


Déjà $ip et $nom ne contient rien de tout.
Si les variables sont utilisé en tant que numérique alors elles sont initialisées à zéro sinon ça sera une chaine vide.
Ensuite même si $ip et $nom auraient été initialisées les apostrophes simples ne permettent pas l'interpolation des variables ce qui fait qu'en ce moment les variables contiennent :

$HOST contient la chaine $ip (littéral)
$HOSTS contient la chaine $nom (littéral)



my $host = $ip ; Ici $host contient la chaine vide donc dans ta session le hostname n'est pas défini il contient une chaine vide

my ($session, $error) = Net::SNMP->session(-hostname => $host ici c'est vide
0
ah j'ai du mal compris les cours que j'ai vu alors :(
remarque j'apprend de mes erreus comme ca, avec mon premier script , mais je pensais qu'en mettant ca elle devrai prendre ce que je metais dans le $ip=<stdind>

et donc devrai ouvir le nom que je mettais donc c'est sur si c'est vide c'est normal que ca peut pas marcher :(,

j'ai enlever les simple guilemet pour qu'il les vois variable mes le probleme persiste :(
0
scrathi > scrathi
17 mars 2010 à 14:15
j'ai un peu avancer et modifier le script ;
avec des info sur un site et ce que tu me dit .
#!/usr/bin/perl -w
use strict;
use warnings;
my $i;
my $choix;
my $nom;
my $ip;
my $t;
my $telnet;
my $username="admin";
my $passwd="motsdepasse";
use lib "C:/Perl/site/lib";
use Net::Telnet;
$t = new Net::Telnet (Timeout => 10,Prompt => '/bash\$ $/');                      
use Net::SNMP;
my $host;
my $snmp_port = 161;
my $oid = " 1.3.6.1.4.1.318.1.1.12.1.5, 1.3.6.1.4.1.318.1.1.12.1.1 ";
my $community = " public ";
do 
{
print "vous voulez recherche par nom ou Par adresse Ip ?\n";
print "nom=1 et Adresse Ip=2 Quitter=3\n";
print"choix:";
$choix=<STDIN>;
if( $choix == 1 )
{
	print"vous avez fait le choix 1 \n";
	print"Saisir un nom : ";
	$host=<STDIN>;
	$t->open($host);
	$t->login($username, $passwd);

}
elsif( $choix == 2 )
{ 
	print"vous avez fait le choix 2\n";
	print"saisir une adresse IP :";
	chomp ($host=<STDIN>);
	print "host => $host\n";
	$t->open($host);
	$t->login($username, $passwd);  <- cette ligne 43
		

	}
else
{
	print"vous avez fait aucun choix \n";

}

} until( $choix==3);
 my ($session, $error) = Net::SNMP->session(-hostname => $host,-timeout => 3,-retries => 1,-community => $community,-port => $snmp_port);


la j'essai de comprendre l'erreur 'problem connection 10.75.xxx.xx port 23 unknow error
ligne 42
0
scrathi > scrathi
17 mars 2010 à 14:15
j'ai un peu avancer et modifier le script ;
avec des info sur un site et ce que tu me dit .
#!/usr/bin/perl -w
use strict;
use warnings;
my $i;
my $choix;
my $nom;
my $ip;
my $t;
my $telnet;
my $username="admin";
my $passwd="motsdepasse";
use lib "C:/Perl/site/lib";
use Net::Telnet;
$t = new Net::Telnet (Timeout => 10,Prompt => '/bash\$ $/');                      
use Net::SNMP;
my $host;
my $snmp_port = 161;
my $oid = " 1.3.6.1.4.1.318.1.1.12.1.5, 1.3.6.1.4.1.318.1.1.12.1.1 ";
my $community = " public ";
do 
{
print "vous voulez recherche par nom ou Par adresse Ip ?\n";
print "nom=1 et Adresse Ip=2 Quitter=3\n";
print"choix:";
$choix=<STDIN>;
if( $choix == 1 )
{
	print"vous avez fait le choix 1 \n";
	print"Saisir un nom : ";
	$host=<STDIN>;
	$t->open($host);
	$t->login($username, $passwd);

}
elsif( $choix == 2 )
{ 
	print"vous avez fait le choix 2\n";
	print"saisir une adresse IP :";
	chomp ($host=<STDIN>);
	print "host => $host\n";
	$t->open($host);
	$t->login($username, $passwd);  <- cette ligne 42
		

	}
else
{
	print"vous avez fait aucun choix \n";

}

} until( $choix==3);
 my ($session, $error) = Net::SNMP->session(-hostname => $host,-timeout => 3,-retries => 1,-community => $community,-port => $snmp_port);


la j'essai de comprendre l'erreur 'problem connection 10.75.xxx.xx port 23 unknow error
ligne 42
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > scrathi
17 mars 2010 à 14:17
Re,

Bon, tu avances pas à pas, mais pas trop méthodique selon moi, ne le prends pas mal.
Essaie de faire les choses une par une. Voir mon message numéro 17.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 mars 2010 à 14:12
Re,

Oui, mais STDIN c'est bien après.
Je pense que pour le moment tu devras laisser tomber la boucle et faire un test un ip en dur pour voir si ça marche.

Si ça sera le cas alors tu verras pour le menu.

Voici un exemple (j'ai un peu rangé ton code) qui sera un bon début, puisque franchement, débutant en Perl c'est un peu compliqué ce que tu fais (en fait je ne sais pas encore ce que tu veux ;-)
#!/usr/bin/perl -w
use strict;use warnings;
use Net::Telnet;
use Net::SNMP;
use lib "C:/Perl/site/lib";

my $username="admin";
my $passwd="motsdepasse";
my $community = " private ";
my $snmp_port = 161;
my $oid = " 1.3.6.1.4.1.318.1.1.12.1.5, 1.3.6.1.4.1.318.1.1.12.1.1 ";
my $host = "ici tu mettras ta valeur";
my $nom = "ici tu mets ta valeur";

my ($session, $error) = Net::SNMP->session(-hostname => $host,
				           -timeout => 3,
					   -retries => 1,
					   -community => $community,
					   -port => $snmp_port
					  );
# SNMP ça te sers à quoi en fait?							      
			
my $telnet = new Net::Telnet (Timeout => 10); # par exemple
$telnet->open($nom);
$telnet->login($username, $passwd);
# ensuite il faut lancer une commande pour faire un test




0
oui , je sais que pour un debutant c'est pas non plus facile mais on me la demander ,

j'utilise le snmp. dans le but de me connecter sur divers equipement qui me permeteron de remonter des infomation avec leur mib ou $oid

au lieu d'aller sur l'equipement lui meme utilise se programme pour le faire a la place
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 mars 2010 à 14:27
Re,

Oui, d'accord, mais pour le moment tu testes telnet.
Donc fait pas à pas et ne te lances pas dans un script trop long.
Il deviendra long après avoir teste les petits bouts de code.

Essaie de mettre tes valeurs et testes seulement la partie connexion par nom.
0
moi j'ai tester le script mis les valeurmais j'ai un timed out waiting from login prompt je pense que ca dois venir de la machine ..

mais ce qui est bizarre en telnet normal cela passe bien mais avec le script j'ai un waiting donc ca doit venir de la machine
0