Bonjour,
je débute en perl et je n'ai pas beaucoup d'expérience en programmation, juste qq scripts VB par ci par là au fur et à mesure des besoins.
J'ai fais un script perl (merci google ) pour me connecter sur des Juniper en SSH et passer des commandes.
Ce script est "alimenté" par deux fichiers : un fichier avec la liste des host à contacter, un fichier avec la liste des commandes à exécuter.
Pour je ne sais quelle raison la première ligne du fichier de commande n'est pas prise en compte, toute les autres le sont (c'est à la ligne 98 que je commence à passer les commandes).
Où est mon erreur ?
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/perl
 
#execute une serie de commandes sur des equipements
#les commandes sont a mettre dans le fichier liste.commande
#pas de ligne vide
#les lignes commencant par # ne sont pas prises en compte
#la liste des equipements est dans le fichier liste.routeurs
#ATTENTION la premiere ligne n'est pas prise en compte par le script
 
use Net::Telnet;
use Time::HiRes qw(usleep);     #pour faire une tempo en microsec
use Net::SSH2;
 
 
 
# Demande log/password
while ($user eq "") {
    print "\nEntrez login : ";
    chomp($user = <STDIN>) ;
}
 
while ($passwd eq "") {
        print "\nEntrez le mot de passe : ";
        system('stty','-echo'); #Hide console input for what we type
        chomp($passwd = <STDIN>) ;
        system('stty','echo'); #Unhide console input for what we type
}
 
#Chargement du fichier de hosts
 
print "\nChargement du fichier contenant la liste des equipements...";
 
$ListeHosts = "liste.routeurs" ;
open(LISTEHOSTS, "<$ListeHosts" ) || die "\nNe peux lire le fichier $ListeHosts: $!";
@hosts = <LISTEHOSTS> ;
close(LISTEHOSTS) ;
print "OK\n";
 
#Chargement du fichier de commandes
print "\nChargement du fichier contenant la liste des commandes 'liste.commandes'...";
$ListeCommandes = 'liste.commandes' ;
open(LISTECOMMANDES, "<$ListeCommandes" ) || die "\nNe peux lire le fichier $ListeCommandes: $!";
@commandes = <LISTECOMMANDES> ;
close(LISTECOMMANDES) ;
print "OK\n";
 
#création fichier log
# Appel de la fonction localtime
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year+=1900; # ajout de 1900 a l'annee
$mon+=1; # ajout de 1 au mois car le premier est zero
print "\nCreation du fichier de log...";
open(LOG_FILE, ">LOGS/log.${year}${mon}${mday}${hour}${min}") || die "\nNe peux ecrire dans le fichier log: $!";
print "OK\n\n\n";
 
print LOG_FILE "Liste des commandes :\n\n";
foreach $commande (@commandes) {
        last if $commande eq "\n" ; # Arret sur la premiere ligne vide
        next if /^#/; # va a la ligne suivante si commentaire
        chomp ($commande); # suppresion du caractere \n
        print LOG_FILE "$commande\n";
}
print LOG_FILE "--------------------------------------------------------------------------------------------------------------------\n";
 
 
HOST:   foreach $host (@hosts)
		{
			chomp ($host); 
			last HOST if $host eq "\n";
			next HOST if /^#/ ;
			print LOG_FILE "--------------------------------------------------------------------------------------------------------------------\n\n";
			print LOG_FILE "Host : $host\n";
 
			#connection
			my $ssh = Net::SSH2->new();
			if(!$ssh->connect($host))
			{
				print $host . " Connexion impossible: ";
				print LOG_FILE "Connexion impossible : \n   " ;
				next HOST;			
			}
 
			if(!$ssh->auth_password($user,$passwd))
			{
				print $host . " Authentication Failed";
				exit(1);
				print LOG_FILE "Authentication Failed : \n   " ;
				next HOST;
			}
 
 
 
			my $channel = $ssh->channel();
			$channel->blocking(0);
			$channel->shell();	
 
			#passage des commandes
			foreach $commande (@commandes)
			{
				chomp($commande);
				print $channel "$commande\n";
				while (<$channel>)
				{
					print LOG_FILE "$_"."\n";
				}  
			usleep(100000); # pause de 100  milisecondes entre chaque commande
			}						
 
 
		} # Fin de la boucle globale passage HOST suivant
	close LOG_FILE;
Contenu du fichier liste.commandes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
Dummy_Line
show interfaces descriptions
show version
Contenu du fichier liste.routeurs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
192.168.18.252
192.168.18.250
Si je remplace la ligne Dummy_Line par une commande elle n'est pas prise en compte
merci de votre aide.