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 112 113 114 115 116 117 118 119 120 121 122 123 124
| #!/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 de commande n'est pas prise en compte par le script
use strict;
use warnings;
use utf8;
use Net::Telnet;
use Time::HiRes qw(usleep); #pour faire une tempo en microsec
use Net::SSH2;
# Demande log/password
my ( $user, $passwd ) = "";
do {
print "\nEntrez login : ";
chomp($user = <STDIN>) ;
} while ($user eq "");
do {
print "\nEntrez password : ";
system('stty','-echo'); #Hide console input for what we type
chomp($passwd = <STDIN>);
system('stty','echo'); #Unhide console input for what we type
} while $passwd eq "";
#Chargement du fichier de hosts
print "\nChargement du fichier contenant la liste des equipements...";
my $ListeHosts = "liste.routeurs" ;
open(LISTEHOSTS, "<$ListeHosts" ) || die "\nNe peux lire le fichier $ListeHosts: $!";
my @hosts = <LISTEHOSTS> ;
close(LISTEHOSTS) ;
print "OK\n";
#Chargement du fichier de commandes
print "\nChargement du fichier contenant la liste des commandes 'liste.commandes'...";
my $ListeCommandes = 'liste.commandes' ;
open(LISTECOMMANDES, "<$ListeCommandes" ) || die "\nNe peux lire le fichier $ListeCommandes: $!";
my @commandes = <LISTECOMMANDES> ;
close(LISTECOMMANDES) ;
print "OK\n";
#création fichier log
# Appel de la fonction localtime
my ($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 my $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 my $host (@hosts)
{
chomp ($host);
last HOST if $host eq "\n";
# next HOST if /^#/ ;
print LOG_FILE "--------------------------------------------------------------------------------------------------------------------\n\n";
print LOG_FILE "Host : $host\n";
print "$host ....";
#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(1);
$channel->shell();
print $channel "conf \n";
#passage des commandes
foreach my $commande (@commandes)
{
chomp($commande);
print $channel "$commande\n";
while (<$channel>)
{
print LOG_FILE "$_"."\n";
}
usleep(100000); # pause de 100 milisecondes entre chaque commande
}
print $channel "commit synchronize and-quit \n";
usleep(100000); # pause de 100 milisecondes entre chaque routeur
print "OK \n"
} # Fin de la boucle globale passage HOST suivant
close LOG_FILE; |
Partager