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
| #!/usr/bin/perl
use strict;
use warnings;
use utf8;
#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
my $user = "";
do {
print "\nEntrez login : ";
chomp($user = <STDIN>);
} while $user eq "";
my $passwd = "";
do {
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
} while $passwd eq "";
#Chargement du fichier de hosts
print "\nChargement du fichier contenant la liste des equipements...";
my $ListeHosts = "liste.routeurs" ;
open(my $LISTEHOSTS, "<:utf8", $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(my $LISTECOMMANDES, "<:utf8", $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(my $LOG_FILE, ">:utf8", "./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 $commande =~ /^#/; # va a la ligne suivante si commentaire
chomp ($commande); # suppresion du caractere \n
print $LOG_FILE "$commande\n";
}
print $LOG_FILE "--------------------------------------------------------------------------------------------------------------------\n";
foreach my $host (@hosts) {
chomp ($host);
last if $host eq "\n";
next if $host =~ /^#/ ;
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 : $!\n";
print $LOG_FILE "Connexion impossible : $!\n" ;
next;
}
if(!$ssh->auth_password( $user, $passwd))
{
print $host . " Authentication Failed : $!\n";
exit(1);
print $LOG_FILE "Authentication Failed : $!\n" ;
next;
}
my $channel = $ssh->channel();
$channel->blocking(0);
$channel->shell();
#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
}
} # Fin de la boucle globale passage HOST suivant
close $LOG_FILE; |
Partager