Script Perl et Batch pour récupération d'info
Fermé
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
-
12 juin 2007 à 11:33
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 14 juin 2007 à 11:45
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 14 juin 2007 à 11:45
A voir également:
- Script Perl et Batch pour récupération d'info
- Script vidéo youtube - Guide
- Info pc - Guide
- Fichier batch - Guide
- Crystaldisk info - Télécharger - Informations & Diagnostic
- Wifi info view - Télécharger - Divers Réseau & Wi-Fi
18 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
12 juin 2007 à 19:05
12 juin 2007 à 19:05
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".
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 569
12 juin 2007 à 11:47
12 juin 2007 à 11:47
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?
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
12 juin 2007 à 11:52
12 juin 2007 à 11:52
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 ? ^^
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 569
12 juin 2007 à 12:23
12 juin 2007 à 12:23
Pour les mails tu as aussi http://www.alianwebserver.com/informatique/languages/perl/mail.htm
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
12 juin 2007 à 13:20
12 juin 2007 à 13:20
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
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 569
12 juin 2007 à 13:38
12 juin 2007 à 13:38
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 :-))
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
12 juin 2007 à 13:45
12 juin 2007 à 13:45
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 ;-)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
12 juin 2007 à 16:34
12 juin 2007 à 16:34
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]$;-))
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
12 juin 2007 à 16:52
12 juin 2007 à 16:52
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) ^^
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 569
13 juin 2007 à 01:38
13 juin 2007 à 01:38
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 :-))
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
13 juin 2007 à 11:05
13 juin 2007 à 11:05
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";
}
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
13 juin 2007 à 11:27
13 juin 2007 à 11:27
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".
;-))
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
13 juin 2007 à 11:31
13 juin 2007 à 11:31
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 ^^
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
13 juin 2007 à 11:38
13 juin 2007 à 11:38
Pas la peine d'essayer, à partir du moment où il n'y a pas de condition, il affiche toutes les lignes de la commande "df".
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
13 juin 2007 à 11:43
13 juin 2007 à 11:43
ah oki il affiche tout ^^
Mais justement normalement avec le if il ne devrait pas y avoir dans le fichier $message uniquement les lignes où le $5 est supérieur à $limit ? Pourquoi à ce moment là il affiche l'intégralité du if c'est ça que j'arrive pas à comprendre.
Mais justement normalement avec le if il ne devrait pas y avoir dans le fichier $message uniquement les lignes où le $5 est supérieur à $limit ? Pourquoi à ce moment là il affiche l'intégralité du if c'est ça que j'arrive pas à comprendre.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
13 juin 2007 à 11:46
13 juin 2007 à 11:46
Affiche ton script s'il te plaît.
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
13 juin 2007 à 11:55
13 juin 2007 à 11:55
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
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
13 juin 2007 à 12:09
13 juin 2007 à 12:09
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 }';-)
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 569
13 juin 2007 à 17:31
13 juin 2007 à 17:31
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";
}
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
14 juin 2007 à 11:34
14 juin 2007 à 11:34
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";
}
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 569
14 juin 2007 à 11:45
14 juin 2007 à 11:45
Tu as fait ton, choix, c'est bien :-))
Bonne continuation et bravo Jipicy
Bonne continuation et bravo Jipicy