Script Perl et Batch pour récupération d'info
Maillon
Messages postés
156
Date d'inscription
Statut
Membre
Dernière intervention
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Voilà,
bon le perl je connais pas pas des masse non plus donc bon ^^
J'aimerai faire un script perl qui interroge à distance un serveur et qui remonte des informations comme l'espace disque utilisé sur chaque partition (df -h).
Après le script ce chargerai d'envoyé un mail si la valeur retournée est supérieur à telle valeur par exemple.
Voilà ce que j'ai pour le moment dans mon script info.pl :
--------------------------------------------
#!/usr/bin/perl -w
use strict;
use Net::SSH::Perl;
my $host = "cerbere";
my $username = "mon_login";
my $password = "mon_pass";
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
$ssh->cmd('sh /home/mon_login/message.sh');
--------------------------------------------
Et dans le message.sh :
--------------------------------------------
#!/bin/sh
email="maillon@commentcamarche.net"
message=/home/mon_login/script/recap.$$
limit="80"
df -h | tr "%" " " | awk '{ if ( $5 > $limit ) print $6" est utilisé a "$5"%. Il reste "$4" sur "$2" disponibles pour "$1"\n" } ' > $message
serveur=/bin/hostname
if [ $5 > $limit ]
then
mail -s "Alerte sur le serveur "$serveur" sur la partition "$6"." $email
fi
-------------------------------------------------
Sachant que j'ai bien copié le script message.sh sur toute les machines.
Alors pour l'instant j'ai deux souci : le premier c'est que le mail n'est pas envoyé. Pourtant je peux envoyé des mails par telnet.
Le deuxième souci majeur varie en fonction des serveurs sur lequel le script message.sh est exécuté, je m'explique.
Quand je lance la commande df -h j'obtiens ça :
---------------------------------------------------
SysFichier Tail. Util.Disp. Uti% Monté sur
/dev/sda8 2.0G 394M 1.5G 21% /
/dev/sda3 190M 11M 170M 6% /boot
none 1004M 0 1004M 0% /dev/shm
/dev/sda7 1012M 33M 928M 4% /tmp
/dev/sda5 9.7G 2.5G 6.7G 28% /usr
/dev/sda9 9.7G 546M 8.6G 6% /var
/dev/sda10 40G 49M 38G 1% /data
/dev/sda2 3.2G 37M 3.0G 2% /home
----------------------------------------------------
Sur le serveur cerbere (red hat 3) le script message.sh me génère un fichier dans lequel il y a :
--------------------------------------------------
/ est utilisé a 21%. Il reste 1.5G sur 2.0G disponibles pour /dev/sda8
/boot est utilisé a 6%. Il reste 170M sur 190M disponibles pour /dev/sda3
/tmp est utilisé a 4%. Il reste 928M sur 1012M disponibles pour /dev/sda7
/usr est utilisé a 28%. Il reste 6.7G sur 9.7G disponibles pour /dev/sda5
/var est utilisé a 6%. Il reste 8.6G sur 9.7G disponibles pour /dev/sda9
/data est utilisé a 1%. Il reste 38G sur 40G disponibles pour /dev/sda10
/home est utilisé a 2%. Il reste 3.0G sur 3.2G disponibles pour /dev/sda2
---------------------------------------------------
Donc ça marche là ^^
Par contre sur l'autre serveur zeus (red hat 4), le df -h me génère ça :
----------------------------------------------------
Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur
/dev/mapper/VolGroup_ID_21242-LogVol1
1008M 506M 452M 53% /
/dev/sda3 99M 17M 78M 18% /boot
none 972M 0 972M 0% /dev/shm
/dev/mapper/VolGroup_ID_21242-LogVol2
496M 11M 460M 3% /tmp
/dev/mapper/VolGroup_ID_21242-LogVol5
9,9G 3,0G 6,6G 32% /usr
/dev/mapper/VolGroup_ID_21242-LogVol4
3,1G 195M 2,7G 7% /var
/dev/mapper/VolGroup_ID_21242-LogVolHome
131G 3,4G 121G 3% /home
------------------------------------------------------
Et le script message.sh me génère ça :
--------------------------------------------------------
est utilisé a /%. Il reste 53 sur 506M disponibles pour 1008M
/boot est utilisé a 18%. Il reste 78M sur 99M disponibles pour /dev/sda3
est utilisé a /tmp%. Il reste 3 sur 11M disponibles pour 496M
est utilisé a /usr%. Il reste 32 sur 3,0G disponibles pour 9,9G
est utilisé a /var%. Il reste 7 sur 195M disponibles pour 3,1G
est utilisé a /home%. Il reste 3 sur 3,4G disponibles pour 131G
----------------------------------------------------------
Il y a un léger petit souci là ...
Je continue de chercher mais si vous avez des idées ou solutions n'hésitez pas ^^
Merci de votre aide ;-)
bon le perl je connais pas pas des masse non plus donc bon ^^
J'aimerai faire un script perl qui interroge à distance un serveur et qui remonte des informations comme l'espace disque utilisé sur chaque partition (df -h).
Après le script ce chargerai d'envoyé un mail si la valeur retournée est supérieur à telle valeur par exemple.
Voilà ce que j'ai pour le moment dans mon script info.pl :
--------------------------------------------
#!/usr/bin/perl -w
use strict;
use Net::SSH::Perl;
my $host = "cerbere";
my $username = "mon_login";
my $password = "mon_pass";
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
$ssh->cmd('sh /home/mon_login/message.sh');
--------------------------------------------
Et dans le message.sh :
--------------------------------------------
#!/bin/sh
email="maillon@commentcamarche.net"
message=/home/mon_login/script/recap.$$
limit="80"
df -h | tr "%" " " | awk '{ if ( $5 > $limit ) print $6" est utilisé a "$5"%. Il reste "$4" sur "$2" disponibles pour "$1"\n" } ' > $message
serveur=/bin/hostname
if [ $5 > $limit ]
then
mail -s "Alerte sur le serveur "$serveur" sur la partition "$6"." $email
fi
-------------------------------------------------
Sachant que j'ai bien copié le script message.sh sur toute les machines.
Alors pour l'instant j'ai deux souci : le premier c'est que le mail n'est pas envoyé. Pourtant je peux envoyé des mails par telnet.
Le deuxième souci majeur varie en fonction des serveurs sur lequel le script message.sh est exécuté, je m'explique.
Quand je lance la commande df -h j'obtiens ça :
---------------------------------------------------
SysFichier Tail. Util.Disp. Uti% Monté sur
/dev/sda8 2.0G 394M 1.5G 21% /
/dev/sda3 190M 11M 170M 6% /boot
none 1004M 0 1004M 0% /dev/shm
/dev/sda7 1012M 33M 928M 4% /tmp
/dev/sda5 9.7G 2.5G 6.7G 28% /usr
/dev/sda9 9.7G 546M 8.6G 6% /var
/dev/sda10 40G 49M 38G 1% /data
/dev/sda2 3.2G 37M 3.0G 2% /home
----------------------------------------------------
Sur le serveur cerbere (red hat 3) le script message.sh me génère un fichier dans lequel il y a :
--------------------------------------------------
/ est utilisé a 21%. Il reste 1.5G sur 2.0G disponibles pour /dev/sda8
/boot est utilisé a 6%. Il reste 170M sur 190M disponibles pour /dev/sda3
/tmp est utilisé a 4%. Il reste 928M sur 1012M disponibles pour /dev/sda7
/usr est utilisé a 28%. Il reste 6.7G sur 9.7G disponibles pour /dev/sda5
/var est utilisé a 6%. Il reste 8.6G sur 9.7G disponibles pour /dev/sda9
/data est utilisé a 1%. Il reste 38G sur 40G disponibles pour /dev/sda10
/home est utilisé a 2%. Il reste 3.0G sur 3.2G disponibles pour /dev/sda2
---------------------------------------------------
Donc ça marche là ^^
Par contre sur l'autre serveur zeus (red hat 4), le df -h me génère ça :
----------------------------------------------------
Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur
/dev/mapper/VolGroup_ID_21242-LogVol1
1008M 506M 452M 53% /
/dev/sda3 99M 17M 78M 18% /boot
none 972M 0 972M 0% /dev/shm
/dev/mapper/VolGroup_ID_21242-LogVol2
496M 11M 460M 3% /tmp
/dev/mapper/VolGroup_ID_21242-LogVol5
9,9G 3,0G 6,6G 32% /usr
/dev/mapper/VolGroup_ID_21242-LogVol4
3,1G 195M 2,7G 7% /var
/dev/mapper/VolGroup_ID_21242-LogVolHome
131G 3,4G 121G 3% /home
------------------------------------------------------
Et le script message.sh me génère ça :
--------------------------------------------------------
est utilisé a /%. Il reste 53 sur 506M disponibles pour 1008M
/boot est utilisé a 18%. Il reste 78M sur 99M disponibles pour /dev/sda3
est utilisé a /tmp%. Il reste 3 sur 11M disponibles pour 496M
est utilisé a /usr%. Il reste 32 sur 3,0G disponibles pour 9,9G
est utilisé a /var%. Il reste 7 sur 195M disponibles pour 3,1G
est utilisé a /home%. Il reste 3 sur 3,4G disponibles pour 131G
----------------------------------------------------------
Il y a un léger petit souci là ...
Je continue de chercher mais si vous avez des idées ou solutions n'hésitez pas ^^
Merci de votre aide ;-)
A voir également:
- Script Perl et Batch pour récupération d'info
- Récupération de déchets - Guide
- Crystal disk info - Télécharger - Informations & Diagnostic
- Info pc - Guide
- Script vidéo youtube - Guide
- Fichier batch - Guide
18 réponses
Re-
Tiens chez moi en ayant "sendmail" d'installer, avec un simple script "bash" ça marche :
- "-e" : Option permettant d'enchaîner plusieurs commandes
- /.../ : Caractère délimiteur. On recherche le motif qui se trouve entre
- \ : Caractère d'échappement
- /^\/dev\/ide/ : Condition. Si la ligne commence (^) par le motif "/dev/ide/"
- s/$/#/ : On substitue la fin de ligne ($) par un dièse (#)
- -e :a : Boucle de branchement
- -e '/#$/N ; s/#\n/ /; ta' : Si la ligne s'achève par un dièse (#$), on ajoute la ligne suivante (N) dans le buffer (tampon) et on substitue le retour à la ligne (\n) par un espace "/ /" puis on fait un test de condition (t) pour la boucle. Si la ligne a été modifiée on se branche au début de la boucle "a".
- -e '1d' : On efface la 1ère ligne qui correspond à "Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur"
Voilou. Adapte le script à ton cas (notamment le "/dev/ide" à transformer en "/dev/mapper", enfin sers-toi plutôt de la syntaxe que je t'ai mise au post #7.
;-))
PS. J'ai modifié la ligne de "awk" en rajoutant "awk -v limit=$limit" afin d'initialiser la variable pour qu'elle soit prise en compte par "awk".
Tiens chez moi en ayant "sendmail" d'installer, avec un simple script "bash" ça marche :
#!/bin/bash email="jipicy@commentcamarche.com" message="/home/jp/tmpfs/recap.$$" limit="80" df -h |\ sed -e '/^\/dev\/ide/ s/$/#/' -e :a -e '/#$/N ;s/#\n[ ][ ]*/ /; ta' -e '1d' |\ tr "%" " " | awk -v limit=$limit '{ if ( $5 > limit ) print $6" est utilisé a "$5"%. Il reste "$4" sur "$2" disponibles pour "$1"\n" } ' > $message serveur=$(/bin/hostname) if [ -s "$message" ] then cat "$message" | mail "$email" -s "Alerte disque $serveur..." fiEn ce qui concerne la ligne "sed" (j'ai rajouté juste un ch'tit truc à la fin), mais voilà les explications :
sed -e '/^\/dev\/ide/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta' -e '1d'
- "-e" : Option permettant d'enchaîner plusieurs commandes
- /.../ : Caractère délimiteur. On recherche le motif qui se trouve entre
- \ : Caractère d'échappement
- /^\/dev\/ide/ : Condition. Si la ligne commence (^) par le motif "/dev/ide/"
- s/$/#/ : On substitue la fin de ligne ($) par un dièse (#)
- -e :a : Boucle de branchement
- -e '/#$/N ; s/#\n/ /; ta' : Si la ligne s'achève par un dièse (#$), on ajoute la ligne suivante (N) dans le buffer (tampon) et on substitue le retour à la ligne (\n) par un espace "/ /" puis on fait un test de condition (t) pour la boucle. Si la ligne a été modifiée on se branche au début de la boucle "a".
- -e '1d' : On efface la 1ère ligne qui correspond à "Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur"
Voilou. Adapte le script à ton cas (notamment le "/dev/ide" à transformer en "/dev/mapper", enfin sers-toi plutôt de la syntaxe que je t'ai mise au post #7.
;-))
PS. J'ai modifié la ligne de "awk" en rajoutant "awk -v limit=$limit" afin d'initialiser la variable pour qu'elle soit prise en compte par "awk".
Salut,
je suis au boulot et je ne peux pas tester, je vais voir de plus près chez moi ce soir
en revanche j'ai une question
pourquoi ne fait tu tout en shell ou tout en perl, l'histoire de messages .sh ?
Pour envoyer le mail on pourra utilisé un module perl par exemple.
Pour ton histoire d'affichage c'est normal
sur le 1er pc tu as sur une ligne
/dev/sda8 2.0G 394M 1.5G 21% /
sur le 2ème pc tu as sur 2 lignes l'affichag
/dev/mapper/VolGroup_ID_21242-LogVol1
1008M 506M 452M 53% /
au lieu de
/dev/mapper/VolGroup_ID_21242-LogVol1 1008M 506M 452M 53% /
à voir pourquoi?
je suis au boulot et je ne peux pas tester, je vais voir de plus près chez moi ce soir
en revanche j'ai une question
pourquoi ne fait tu tout en shell ou tout en perl, l'histoire de messages .sh ?
Pour envoyer le mail on pourra utilisé un module perl par exemple.
Pour ton histoire d'affichage c'est normal
sur le 1er pc tu as sur une ligne
/dev/sda8 2.0G 394M 1.5G 21% /
sur le 2ème pc tu as sur 2 lignes l'affichag
/dev/mapper/VolGroup_ID_21242-LogVol1
1008M 506M 452M 53% /
au lieu de
/dev/mapper/VolGroup_ID_21242-LogVol1 1008M 506M 452M 53% /
à voir pourquoi?
Euh le pourquoi j'utilise du perl et du batch c'est que ... euh che pas en fait c'est le plus simple que j'ai trouvé mais maintenant si je peux faire tout en perl ou batch je dis ui ça sera plus simple ^^
Ui j'ai bien noté t'as remarque aussi mais je ne sais vraiment pas pourquoi. Peut être que le $1 est trop grand ...
Peut etre que si je supprime le début du $1 (c'est à dire /dev/mapper qui est récurrent) peut etre que ça marchera ... (en utilisant la commande tr je pense non ?)
Et pour le mail en fait peut etre que je devrai utilisé le module Net::SMTP ... non ? ^^
Ui j'ai bien noté t'as remarque aussi mais je ne sais vraiment pas pourquoi. Peut être que le $1 est trop grand ...
Peut etre que si je supprime le début du $1 (c'est à dire /dev/mapper qui est récurrent) peut etre que ça marchera ... (en utilisant la commande tr je pense non ?)
Et pour le mail en fait peut etre que je devrai utilisé le module Net::SMTP ... non ? ^^
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Il est super ce lien ^^ merci :)
Par contre comme tu le disais le souci c'est que la moitié de mon prog est en batch (le script qui execute la commande df -h et qui me retourne l'information et qui envoie le mail) et l'autre en perl (le script qui permet de se connecter à la machine distante pour executer un script)
Et dans mon cas l'envoie de mail se fait en batch donc à moins de réecrire ce script en perl je vois pas comment je pourrais utiliser le module MIME::Lite .... xD
Et j'ai essayer de taper la commande suivante dans une console et elle marche (j'ai bien recu un mail) :
echo test | mail -s test adresse@domaine.com
Par contre comme tu le disais le souci c'est que la moitié de mon prog est en batch (le script qui execute la commande df -h et qui me retourne l'information et qui envoie le mail) et l'autre en perl (le script qui permet de se connecter à la machine distante pour executer un script)
Et dans mon cas l'envoie de mail se fait en batch donc à moins de réecrire ce script en perl je vois pas comment je pourrais utiliser le module MIME::Lite .... xD
Et j'ai essayer de taper la commande suivante dans une console et elle marche (j'ai bien recu un mail) :
echo test | mail -s test adresse@domaine.com
Salut,
Et j'ai essayer de taper la commande suivante dans une console et elle marche (j'ai bien recu un mail) :
echo test | mail -s test adresse@domaine.com
ce n'est pas de bash ça, c'est du C
je vois pas comment je pourrais utiliser le module MIME::Lite .... xD
il faut juste installer le module
mais on ne vas pas compliquer
je vais essayer ce soir d'écrire un bout de code pour resoudre ton problème :-))
Et j'ai essayer de taper la commande suivante dans une console et elle marche (j'ai bien recu un mail) :
echo test | mail -s test adresse@domaine.com
ce n'est pas de bash ça, c'est du C
je vois pas comment je pourrais utiliser le module MIME::Lite .... xD
il faut juste installer le module
mais on ne vas pas compliquer
je vais essayer ce soir d'écrire un bout de code pour resoudre ton problème :-))
c'est du C ? .... xD ah la boulette lol pour dire que j'y connais vraiment rien en prog lol
J'ai installer le module MIME::Lite avec cpan mais c'est tout ^^
Oki bah je continu d'essayer des trucs de mon côté et dès que tu as quelques chose reviens vite :-)
merci en tout cas ;-)
J'ai installer le module MIME::Lite avec cpan mais c'est tout ^^
Oki bah je continu d'essayer des trucs de mon côté et dès que tu as quelques chose reviens vite :-)
merci en tout cas ;-)
Salut,
Pour ton 2nd soucis, tu peux inclure cette instruction dans ta ligne de script :
Pour ton 2nd soucis, tu peux inclure cette instruction dans ta ligne de script :
sed -e '/^\/dev\/mapper/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta'Ce qui donnerait :
df -h |\ sed -e '/^\/dev\/mapper/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta' |\ tr "%" " " |\ awk '{ if ( $5 > $limit ) print $6" est utilisé a "$5"%. Il reste "$4" sur "$2" disponibles pour "$1"\n" } ' > $messageLa preuve en image :
[jp@MDK tmpfs]$ cat plop Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur /dev/sda8 2.0G 394M 1.5G 21% / /dev/sda3 190M 11M 170M 6% /boot none 1004M 0 1004M 0% /dev/shm /dev/sda7 1012M 33M 928M 4% /tmp /dev/sda5 9.7G 2.5G 6.7G 28% /usr /dev/sda9 9.7G 546M 8.6G 6% /var /dev/sda10 40G 49M 38G 1% /data /dev/sda2 3.2G 37M 3.0G 2% /home /dev/mapper/VolGroup_ID_21242-LogVol1 1008M 506M 452M 53% / /dev/sda3 99M 17M 78M 18% /boot none 972M 0 972M 0% /dev/shm /dev/mapper/VolGroup_ID_21242-LogVol2 496M 11M 460M 3% /tmp /dev/mapper/VolGroup_ID_21242-LogVol5 9,9G 3,0G 6,6G 32% /usr /dev/mapper/VolGroup_ID_21242-LogVol4 3,1G 195M 2,7G 7% /var /dev/mapper/VolGroup_ID_21242-LogVolHome 131G 3,4G 121G 3% /home [jp@MDK tmpfs]$ sed -e '/^\/dev\/mapper/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta' plop Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur /dev/sda8 2.0G 394M 1.5G 21% / /dev/sda3 190M 11M 170M 6% /boot none 1004M 0 1004M 0% /dev/shm /dev/sda7 1012M 33M 928M 4% /tmp /dev/sda5 9.7G 2.5G 6.7G 28% /usr /dev/sda9 9.7G 546M 8.6G 6% /var /dev/sda10 40G 49M 38G 1% /data /dev/sda2 3.2G 37M 3.0G 2% /home /dev/mapper/VolGroup_ID_21242-LogVol1 1008M 506M 452M 53% / /dev/sda3 99M 17M 78M 18% /boot none 972M 0 972M 0% /dev/shm /dev/mapper/VolGroup_ID_21242-LogVol2 496M 11M 460M 3% /tmp /dev/mapper/VolGroup_ID_21242-LogVol5 9,9G 3,0G 6,6G 32% /usr /dev/mapper/VolGroup_ID_21242-LogVol4 3,1G 195M 2,7G 7% /var /dev/mapper/VolGroup_ID_21242-LogVolHome 131G 3,4G 121G 3% /home [jp@MDK tmpfs]$;-))
Oué merci jipicy !! ça marche ça !! :D hihiihhi
Par contre euh ... j'ai rien compris à la commande ... xD lol
Et puis vu que je vais ne faire que un seul script en perl (c'est beaucoup plus pratique) est ce que cette commande marche en perl ?
Sinon j'ai rajouter ça dans mon script perl qui se connecte en ssh sur une autre machine
#!/usr/bin/perl -w
use strict;
use Net::SSH::Perl;
my $host = "cerbere";
my $username = "mon_login";
my $password = "mon_passe";
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
my ($out, $err, $exit) = $ssh->cmd("df -h");
print $out;
# dans la variable list je met le $out
my @list = $out;
# j'affiche la 5eme colonne
print $list[4] ;
# je parcours list
foreach $list {
# je décompose la list en élements
push @element, $list
# si @element est supérieur à 80% ou plus
if (@element > /8\d%/) {
# j'utilise MIME::Lite pour envoyer mon mail
my $mail = MIME::Lite->new (
From=>'root@domaine.net',
Cc=>undefined,
To=>'admin@domaine.net',
Subject=>"Une partition devient trop importante",
Data=>undefined );
# envoie du mail
$mail->send();
}
}
Mais je pense qu'il y a des erreurs (voir peut etre que tout est faux lol mais bon vu que je suis une bête en perl ... xD lol) ^^
Par contre euh ... j'ai rien compris à la commande ... xD lol
Et puis vu que je vais ne faire que un seul script en perl (c'est beaucoup plus pratique) est ce que cette commande marche en perl ?
Sinon j'ai rajouter ça dans mon script perl qui se connecte en ssh sur une autre machine
#!/usr/bin/perl -w
use strict;
use Net::SSH::Perl;
my $host = "cerbere";
my $username = "mon_login";
my $password = "mon_passe";
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
my ($out, $err, $exit) = $ssh->cmd("df -h");
print $out;
# dans la variable list je met le $out
my @list = $out;
# j'affiche la 5eme colonne
print $list[4] ;
# je parcours list
foreach $list {
# je décompose la list en élements
push @element, $list
# si @element est supérieur à 80% ou plus
if (@element > /8\d%/) {
# j'utilise MIME::Lite pour envoyer mon mail
my $mail = MIME::Lite->new (
From=>'root@domaine.net',
Cc=>undefined,
To=>'admin@domaine.net',
Subject=>"Une partition devient trop importante",
Data=>undefined );
# envoie du mail
$mail->send();
}
}
Mais je pense qu'il y a des erreurs (voir peut etre que tout est faux lol mais bon vu que je suis une bête en perl ... xD lol) ^^
Salut,
récapitulons
donc tu veux interroger un serveur
pour ça depuis le client tu te connecte avec un script perl
qui va executé un script shell se trouvant sur le serveur
qui script shell execute la commande df -h et le résultat est enregistrer dans un fichier
et ensuite l'envoie de mail
Voilà ce que je te propose
Avec un seul script Perl se trouvant sur le client tu fait tout (donc plus besoin de script shell sur le server) -
connexion sur le serveur, la collecte des données et l'envoie de mail
Le script
https://www.cjoint.com/?gnbJJxFWSP
Bon, je pouvais collecter le résultat de la commande df -h et de parser la variable à l'intérieur de script.
Si besoin pour gagne de performance je peux le faire, à toi de me le dire.
Pareil our l'affichage, si tu veux afficher autrement il faut modifier ou me dire quoi modifier si tu crois que tu n'arrives pas.
Si tu ne veux pas utiliser MIME::Lite tu peux toujours utiliser la commande mail, pareil il faut le dire pour que je fasse les modifications.
En bref le script te perment de te connecter et de récupérer le résultat de la commande lancée sur le server et ensuite l'envoi de mail, tandis que ton raisonnement c'était de se connecter sur le server et de charger le script se trouvant sur le server de traiter tout (ce qui n'est pas mauvais non plus).
C'est bien quand il y a plusieurs solutions, tu pourras utiliser celle qui te convient :-))
Je vais aller me couché maintenant :-))
récapitulons
donc tu veux interroger un serveur
pour ça depuis le client tu te connecte avec un script perl
qui va executé un script shell se trouvant sur le serveur
qui script shell execute la commande df -h et le résultat est enregistrer dans un fichier
et ensuite l'envoie de mail
Voilà ce que je te propose
Avec un seul script Perl se trouvant sur le client tu fait tout (donc plus besoin de script shell sur le server) -
connexion sur le serveur, la collecte des données et l'envoie de mail
Le script
#!/usr/bin/perl use strict;use warnings use Net::SSH::Perl; use MIME::Lite; my $host = "localhost"; # à modifier my $username = "lami20j"; # à modifier my $password = "**********"; # à modifier my $df=q{df -h | perl -ne 'next unless /%\s/; @t=split /\s+/; print "$t[5] est utilisé à $t[4]. Il reste $t[2] sur $t[1] disponible pour $t[0]\n" if $t[4] > 38' }; my $ssh = Net::SSH::Perl->new($host); $ssh->login($username, $password); my ($out, $err, $exit) = $ssh->cmd("$df"); if($out){ MIME::Lite->send('smtp','smtp.free.fr'); my $msg = new MIME::Lite From => 'lami20j@free.fr', To => 'lami20j@yahoo.fr', Subject => "Espace disque - Consomation", Type => 'TEXT', Data => $out; $msg->send(); print "***** MESSAGE ENVOYE *****\n"; } __END__L'exécution
lami20j@deb:~$ perl ccm.pl ***** MESSAGE ENVOYE *****Le résultat
https://www.cjoint.com/?gnbJJxFWSP
Bon, je pouvais collecter le résultat de la commande df -h et de parser la variable à l'intérieur de script.
Si besoin pour gagne de performance je peux le faire, à toi de me le dire.
Pareil our l'affichage, si tu veux afficher autrement il faut modifier ou me dire quoi modifier si tu crois que tu n'arrives pas.
Si tu ne veux pas utiliser MIME::Lite tu peux toujours utiliser la commande mail, pareil il faut le dire pour que je fasse les modifications.
En bref le script te perment de te connecter et de récupérer le résultat de la commande lancée sur le server et ensuite l'envoi de mail, tandis que ton raisonnement c'était de se connecter sur le server et de charger le script se trouvant sur le server de traiter tout (ce qui n'est pas mauvais non plus).
C'est bien quand il y a plusieurs solutions, tu pourras utiliser celle qui te convient :-))
Je vais aller me couché maintenant :-))
Alors merci à vous deux déjà de vous être penché sur mon cas ^^ C'est bien parce que j'ai d'un côté la méthode batch et l'autre perl ^^ hihii
Merci jipicy j'ai un peu mieux compris comment marchais la commande lol ^^ (je vais faire davantages de recherche sur la commande sed pour essayer de mieux comprendre ^^). En tout cas merci parce que ta méthode marche ^^
Par contre j'ai un trou de mémoire, je ne comprend pas à quoi sert le if dans le awk car même si $5 est inférieur à $limit bah j'afficherai le résultat complet de la commande df -h non ? enfin c'est ce que j'ai sur mon pc en tout cas ^^
Merci lami ! en plus j'ai presque tout compris au script ^^ héhé
Voici si ce que je comprend et ne comprend pas ^^
####### initialisation de variables qui vont nous permettre de se connecter en ssh #######
my $host = "localhost"; # à modifier
my $username = "lami20j"; # à modifier
my $password = "**********"; # à modifier
####### là je comprend pas le q{df -h | perl -ne 'next unless /%\s/; . A part le df -h ici j'ai rien compris du tout xD ^^#######
my $df=q{df -h | perl -ne 'next unless /%\s/;
####### ici je comprend pas comment le split peut récupérer le résultat du df -h. Par contre je crois qu'en suite on met dans la variable @t tous les éléments généré par le split Mais je ne comprend pas le /\s+/ ######
@t=split /\s+/;
print "$t[5] est utilisé à $t[4].
Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
####### Euh il sert à quoi le if ici ... si $t[4] > 38 bah on fait quoi ?? ########
if $t[4] > 38'
};
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
my ($out, $err, $exit) = $ssh->cmd("$df");
####### Ici le if sert bien à vérifié qu'il y a quelque chose dans la sortie $out c'est ça ? et si c'est le cas bah on envoie un mail ? #########
if($out){
MIME::Lite->send('smtp','smtp.free.fr');
####### Par contre ici le my $msg = new MIME::Lite sert à quoi ? à dire qu'on va créer un nouveau message c'est ça ? Mais si c'est ça il ça serait pas plutot un truc du genre my $msg=MIME::Lite->new ( from ..... ) non ??? ##########
my $msg = new MIME::Lite
From => 'lami20j@free.fr',
To => 'lami20j@yahoo.fr',
Subject => "Espace disque - Consomation",
Type => 'TEXT',
Data => $out;
$msg->send();
print "***** MESSAGE ENVOYE *****\n";
}
Merci jipicy j'ai un peu mieux compris comment marchais la commande lol ^^ (je vais faire davantages de recherche sur la commande sed pour essayer de mieux comprendre ^^). En tout cas merci parce que ta méthode marche ^^
Par contre j'ai un trou de mémoire, je ne comprend pas à quoi sert le if dans le awk car même si $5 est inférieur à $limit bah j'afficherai le résultat complet de la commande df -h non ? enfin c'est ce que j'ai sur mon pc en tout cas ^^
Merci lami ! en plus j'ai presque tout compris au script ^^ héhé
Voici si ce que je comprend et ne comprend pas ^^
####### initialisation de variables qui vont nous permettre de se connecter en ssh #######
my $host = "localhost"; # à modifier
my $username = "lami20j"; # à modifier
my $password = "**********"; # à modifier
####### là je comprend pas le q{df -h | perl -ne 'next unless /%\s/; . A part le df -h ici j'ai rien compris du tout xD ^^#######
my $df=q{df -h | perl -ne 'next unless /%\s/;
####### ici je comprend pas comment le split peut récupérer le résultat du df -h. Par contre je crois qu'en suite on met dans la variable @t tous les éléments généré par le split Mais je ne comprend pas le /\s+/ ######
@t=split /\s+/;
print "$t[5] est utilisé à $t[4].
Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
####### Euh il sert à quoi le if ici ... si $t[4] > 38 bah on fait quoi ?? ########
if $t[4] > 38'
};
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
my ($out, $err, $exit) = $ssh->cmd("$df");
####### Ici le if sert bien à vérifié qu'il y a quelque chose dans la sortie $out c'est ça ? et si c'est le cas bah on envoie un mail ? #########
if($out){
MIME::Lite->send('smtp','smtp.free.fr');
####### Par contre ici le my $msg = new MIME::Lite sert à quoi ? à dire qu'on va créer un nouveau message c'est ça ? Mais si c'est ça il ça serait pas plutot un truc du genre my $msg=MIME::Lite->new ( from ..... ) non ??? ##########
my $msg = new MIME::Lite
From => 'lami20j@free.fr',
To => 'lami20j@yahoo.fr',
Subject => "Espace disque - Consomation",
Type => 'TEXT',
Data => $out;
$msg->send();
print "***** MESSAGE ENVOYE *****\n";
}
Par contre j'ai un trou de mémoire, je ne comprend pas à quoi sert le if dans le awk
Le "if" est une condition qui vérifie si le "champ 5" ($5, autrement dit le pourcentage d'occupation de la partition) est supérieur à la variable "$limit" fixée en début de script et reprise dans la commande "awk" (-v limit=$limit), et si la condition est vérifiée alors on écrit tout ce qui se trouve après le "print" dans le fichier "$message".
;-))
Le "if" est une condition qui vérifie si le "champ 5" ($5, autrement dit le pourcentage d'occupation de la partition) est supérieur à la variable "$limit" fixée en début de script et reprise dans la commande "awk" (-v limit=$limit), et si la condition est vérifiée alors on écrit tout ce qui se trouve après le "print" dans le fichier "$message".
;-))
Ui c'est bien ce que j'avais compris par contre si j'enleve le if ( $5 > $limit) de la commande bah j'ai des informations qui vont dans le fichier $message par contre c'est pas de bonnes informations. Essaye sur ta machine tu comprendra peut etre ce que j'essaye de dire lol ^^
OKI c'est bon j'ai pigé ! xD ^^ lol
En fait moi j'écrivais if ( $5 > $limit ) ce qui me paraissait logique. Mais effectivement toi tu a rajouter limit=$limit pour qu'il soit pris en compte dans le awk si j'ai bien compris ^^
Par contre je ne comprend pas pourquoi si je met $5 > $limit ça marche pas, pourquoi $limit pourtant déclaré au-dessus n'est pas pris en compte dans le awk.
Mais j'ai pigé ouf ^^ hiihihi
En fait moi j'écrivais if ( $5 > $limit ) ce qui me paraissait logique. Mais effectivement toi tu a rajouter limit=$limit pour qu'il soit pris en compte dans le awk si j'ai bien compris ^^
Par contre je ne comprend pas pourquoi si je met $5 > $limit ça marche pas, pourquoi $limit pourtant déclaré au-dessus n'est pas pris en compte dans le awk.
Mais j'ai pigé ouf ^^ hiihihi
Pour qu'une variable externe à "awk" soit prise en compte il faut à ce moment là qu'elle soit en dehors des quotes, exemple :
awk '$5 > '$limit' { print $6 }';-)
Salut,
####### là je comprend pas le q{df -h | perl -ne 'next unless /%\s/; . A part le df -h ici j'ai rien compris du tout xD ^^#######
next unless /%\s/ me permets de sauter la ligne d'entête
si tu fait un df -h tout simplement tu verras la ligne d'en-tête
Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur
quand je dit next unless /%\s/
en fait ça donne : la prochaine ligne sauf s'il y a un % suivi d'un espace (\s c'est pour un espace dans les expressions régulières)
my $df=q{df -h | perl -ne 'next unless /%\s/;
####### ici je comprend pas comment le split peut récupérer le résultat du df -h. Par contre je crois qu'en suite on met dans la variable @t tous les éléments généré par le split Mais je ne comprend pas le /\s+/ ######
il faut comprendre le fonctionnement de la fonction split
split prends une chaine de caractère et l'éclate dans un tableau en foncton de séparateur
dans notre cas j'ai mis \s+ qui veut dire minimum un espace, maximum n'importe
@t=split /\s+/;
print "$t[5] est utilisé à $t[4].
Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
####### Euh il sert à quoi le if ici ... si $t[4] > 38 bah on fait quoi ?? ########
if $t[4] > 38'
};
en fait ici il s'agit d'un idiome Perl qu'on peut l'appeller modificateur d'expression
Exemple
en perl on peut écrire
if ($x>0){
print "positif\n";
}
ou
print "positif\n" if $x > 0;
C'est la même chose
Dans notre cas je dit de capturer les donné de df -h si la limite > 38
J'ai pouvais biensûr écrire
if(limite > 38){
capture df -h
}
mais c'est plus naturel de dire
affiche moi ça si la limite plus grande que 38
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
my ($out, $err, $exit) = $ssh->cmd("$df");
####### Ici le if sert bien à vérifié qu'il y a quelque chose dans la sortie $out c'est ça ? et si c'est le cas bah on envoie un mail ? #########
Ben, oui.
s'il y a quelque chose dans $out ça veut dire que j'ai dépassé la limite
donc j'envoie un mail
s'il n'y a rien if($out) et faux donc je n'envoie rien
if($out){
MIME::Lite->send('smtp','smtp.free.fr');
####### Par contre ici le my $msg = new MIME::Lite sert à quoi ? à dire qu'on va créer un nouveau message c'est ça ? Mais si c'est ça il ça serait pas plutot un truc du genre my $msg=MIME::Lite->new ( from ..... ) non ??? ##########
my $msg = new MIME::Lite
From => 'lami20j@free.fr',
To => 'lami20j@yahoo.fr',
Subject => "Espace disque - Consomation",
Type => 'TEXT',
Data => $out;
$msg->send();
print "***** MESSAGE ENVOYE *****\n";
}
####### là je comprend pas le q{df -h | perl -ne 'next unless /%\s/; . A part le df -h ici j'ai rien compris du tout xD ^^#######
next unless /%\s/ me permets de sauter la ligne d'entête
si tu fait un df -h tout simplement tu verras la ligne d'en-tête
Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur
quand je dit next unless /%\s/
en fait ça donne : la prochaine ligne sauf s'il y a un % suivi d'un espace (\s c'est pour un espace dans les expressions régulières)
my $df=q{df -h | perl -ne 'next unless /%\s/;
####### ici je comprend pas comment le split peut récupérer le résultat du df -h. Par contre je crois qu'en suite on met dans la variable @t tous les éléments généré par le split Mais je ne comprend pas le /\s+/ ######
il faut comprendre le fonctionnement de la fonction split
split prends une chaine de caractère et l'éclate dans un tableau en foncton de séparateur
dans notre cas j'ai mis \s+ qui veut dire minimum un espace, maximum n'importe
@t=split /\s+/;
print "$t[5] est utilisé à $t[4].
Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
####### Euh il sert à quoi le if ici ... si $t[4] > 38 bah on fait quoi ?? ########
if $t[4] > 38'
};
en fait ici il s'agit d'un idiome Perl qu'on peut l'appeller modificateur d'expression
Exemple
en perl on peut écrire
if ($x>0){
print "positif\n";
}
ou
print "positif\n" if $x > 0;
C'est la même chose
Dans notre cas je dit de capturer les donné de df -h si la limite > 38
J'ai pouvais biensûr écrire
if(limite > 38){
capture df -h
}
mais c'est plus naturel de dire
affiche moi ça si la limite plus grande que 38
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
my ($out, $err, $exit) = $ssh->cmd("$df");
####### Ici le if sert bien à vérifié qu'il y a quelque chose dans la sortie $out c'est ça ? et si c'est le cas bah on envoie un mail ? #########
Ben, oui.
s'il y a quelque chose dans $out ça veut dire que j'ai dépassé la limite
donc j'envoie un mail
s'il n'y a rien if($out) et faux donc je n'envoie rien
if($out){
MIME::Lite->send('smtp','smtp.free.fr');
####### Par contre ici le my $msg = new MIME::Lite sert à quoi ? à dire qu'on va créer un nouveau message c'est ça ? Mais si c'est ça il ça serait pas plutot un truc du genre my $msg=MIME::Lite->new ( from ..... ) non ??? ##########
my $msg = new MIME::Lite
From => 'lami20j@free.fr',
To => 'lami20j@yahoo.fr',
Subject => "Espace disque - Consomation",
Type => 'TEXT',
Data => $out;
$msg->send();
print "***** MESSAGE ENVOYE *****\n";
}
Alors en fait j'ai choisis la méthode en shell (mais je vais aussi le faire en perl faut juste que je comprenne un peu plus comment ça marche ^^ )
Voilà le script final :
---------------------------------
#!/bin/bash
email="maillon@domaine.net"
message="/tmp/recap.$$"
limit="80"
df -h |\
sed -e '/^\/dev\/mapper/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta' -e '1d' |\
tr "%" " " | awk -v limit=$limit '{ if ( $5 > limit ) print "La partition "$6" est utilise a "$5"%. Il reste "$4" sur "$2" disponibles pour "$1"\n" } ' > $message
serveur=$(/bin/hostname)
if [ -s "$message" ]
then
cat "$message" | mail "$email" -s "Alerte QUOTA disque sur $serveur."
fi
rm /tmp/recap.*
--------------------------
Les détails du script sont expliqués un peu plus haut dans le sujet.
Voici les liens intéressants :
http://docsrv.caldera.com:8457/en/AdvBashHowto/index.html
guide d utilisation du shell pour debutant
http://abs.traduc.org/abs-4.2.01-fr/index.html
http://www.shellunix.com/index.html
Voili voilou ^^
Par contre dans un souci d'amélioration (et de connaissances ^^) :
ce script ne prend pas en compte les accents ... j'ai vu en faisant un man mail qu'il y avait une option -a qui permettait de changer l'encodage par contre quand je la lance il me dis qu'il ne connait pas l'option -a .... et le net est muet sur cette option ... si vous avez des infos là dessus ... ^^
Et en Perl en fait quand je lance ce script :
quand j'exécute ton script lami et bien il se bloque au niveau de la connexion ssh. Il n'affiche rien il reste et attends che pas quoi... en fait il bloque après le "bouyou" ...
Voilà le script :
#!/usr/bin/perl
use strict;
use warnings;
use Net::SSH::Perl;
use MIME::Lite;
my $host = "cerbere";
my $username = "maillon";
my $password = "maillon";
my $df=q{df -h | perl -ne 'next unless /%\s/;
@t=split /\s+/;
print "$t[5] est utilisé à $t[4].
Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
if $t[4] > 10'
};
print "bouyou\n";
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
print "bip bip\n";
my ($out, $err, $exit) = $ssh->cmd("$df");
print $out;
if($out){
MIME::Lite->send('smtp', 'smtp.domaine.com');
my $msg = new MIME::Lite
From => 'root@cerbere.domaine.net',
To => 'franck@quotatis.net',
Subject => "Espace disque - Consomation",
Type => 'TEXT',
Data => $out;
$msg->send();
print "***** MESSAGE ENVOYE *****\n";
}
Voilà le script final :
---------------------------------
#!/bin/bash
email="maillon@domaine.net"
message="/tmp/recap.$$"
limit="80"
df -h |\
sed -e '/^\/dev\/mapper/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta' -e '1d' |\
tr "%" " " | awk -v limit=$limit '{ if ( $5 > limit ) print "La partition "$6" est utilise a "$5"%. Il reste "$4" sur "$2" disponibles pour "$1"\n" } ' > $message
serveur=$(/bin/hostname)
if [ -s "$message" ]
then
cat "$message" | mail "$email" -s "Alerte QUOTA disque sur $serveur."
fi
rm /tmp/recap.*
--------------------------
Les détails du script sont expliqués un peu plus haut dans le sujet.
Voici les liens intéressants :
http://docsrv.caldera.com:8457/en/AdvBashHowto/index.html
guide d utilisation du shell pour debutant
http://abs.traduc.org/abs-4.2.01-fr/index.html
http://www.shellunix.com/index.html
Voili voilou ^^
Par contre dans un souci d'amélioration (et de connaissances ^^) :
ce script ne prend pas en compte les accents ... j'ai vu en faisant un man mail qu'il y avait une option -a qui permettait de changer l'encodage par contre quand je la lance il me dis qu'il ne connait pas l'option -a .... et le net est muet sur cette option ... si vous avez des infos là dessus ... ^^
Et en Perl en fait quand je lance ce script :
quand j'exécute ton script lami et bien il se bloque au niveau de la connexion ssh. Il n'affiche rien il reste et attends che pas quoi... en fait il bloque après le "bouyou" ...
Voilà le script :
#!/usr/bin/perl
use strict;
use warnings;
use Net::SSH::Perl;
use MIME::Lite;
my $host = "cerbere";
my $username = "maillon";
my $password = "maillon";
my $df=q{df -h | perl -ne 'next unless /%\s/;
@t=split /\s+/;
print "$t[5] est utilisé à $t[4].
Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
if $t[4] > 10'
};
print "bouyou\n";
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
print "bip bip\n";
my ($out, $err, $exit) = $ssh->cmd("$df");
print $out;
if($out){
MIME::Lite->send('smtp', 'smtp.domaine.com');
my $msg = new MIME::Lite
From => 'root@cerbere.domaine.net',
To => 'franck@quotatis.net',
Subject => "Espace disque - Consomation",
Type => 'TEXT',
Data => $out;
$msg->send();
print "***** MESSAGE ENVOYE *****\n";
}