IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[SSH] Appel de commande AWK dans un Bash en SSH


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut [SSH] Appel de commande AWK dans un Bash en SSH
    Bonjour,

    Faisant suite à mon précédent appel à l'aide sur le forum, je souhaiterais à présent pouvoir lancer des commandes en AWK et en déporté via SSH sur une liste de serveurs fournie dans un fichier en entrée.
    Le but serait d'avoir une sorte de buletin de santé des serveurs (espace disque et mémoire), sachant qu'il y a en a beaucoup et de renvoyer ce rapport par email :

    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
    # ! /bin/bash
    #	Espace disque occupés de tous les FS d'une machine (seuils d'alerte et d'erreur en paramètres à changer)
    #	MC le 01/10/2019
     
    # Variables
    fichier="test.txt"		#Fichier en entrée
    email="mon.adresse.email.fr" #Destinataire du message
     
    seuilerr=90             #Seuil d'erreur a*modifier (poucentage d'occupation du disque)
    seuilwarn=70    		#Seuil de warning a*modifier (poucentage d'occupation du disque)
     
     
    while IFS= read -r ligne
    do
     
    	machine="root@"$ligne		
     
    	#Ouverture du canal
     
    	# Espace disque disponible : gestion des alertes
    	dfree=$(ssh -p $machine df -Pm | awk -v err=$seuilerr -v att=$seuilwarn '
    					NR>1 {total+=$2; utilise+=$3; dispo+=$4;
    							if (+$5>err){printf " => ALERTE  : %15s OCCUPE A : %4d% KO\n", $6, $5 }
    							else if (+$5>att){printf " => WARNING : %15s OCCUPE A : %4d% OK\n", $6, $5 }
    							else {printf " => NOTE    : %15s OCCUPE A : %4d% OK\n", $6, $5 }}
    					END{print " => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo"}')
     
    	# Mémoire disponible : pour information
    	mfree=$(ssh -p $machine vmstat 1 2 -S M | awk 'END {print " => Disponibilité du CPU : "$15"% - Mémoire disponible : "$4" Mo"}')				
     
    	message="\n
    	###################\n
    	Nom de la machine : $machine . \n
    	###################\n
    	$dfree  \n 
    	$mfree  \n"
     
    	# Programme principal
    	if [ $(echo $dfree | grep -c ALERTE) -gt 0 ]
    	then
    		echo -e "$message" | /usr/bin/mutt -x -s "Espace disque presque sature sur : " . $machine $email >/dev/null 2>&1
    	fi
     
    done < "$fichier"
     
     
    # Fin
    exit 0
    Comme la dernière fois, si jamais vous aviez des observations ou des suggestions d'autres indicateurs à faire ressortir en plus de mon code, n'hésitez pas.

    Par avance merci.

    Marco.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    Bonjour,

    le script que tu montres ne fonctionne pas comme tu le souhaites ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Bonsoir,

    En fait, je ne suis pas très certain du fonctionnement et je ne peux pas complètement tester de manière optimale.
    Pourrais-tu en particulier me donner ton avis sur la manière donc je fais les appels SSH s'il te plaît ?

    Bonne soirée,
    Marco.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    je ferais le traitement awk en local :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh -p "$port" "$serveur" 'command' | awk ...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Bonjour,

    Tout d'abord, merci de ta réponse.

    En fait ce sont des données que je souhaite récupérer sur une liste de serveur (connecté en SSH), les formater (dans mon AWK) et les concaténer pour les envoyer en une seule fois par email.
    Mais peut-être que je m'y prends mal ? ou bien est-ce trop verbeux tel que je le fais ?

    En tout les cas, mon manque d'expérience dans ce domaine fait que je ne sais pas trop où chercher. Si il y a d'autre commandes avec des résultats intéressants, je suis aussi preneur ?

    Ça me permettrait d'avoir une sorte de bilan de santé de ces serveurs, sachant qu'il y a en a beaucoup et d'orienter les investigations en cas de soucis.

    Bonne journée,
    Marco.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    on ne peut pas valider un traitement de données sans données.

    des œufs, de la farine, du beurre et du sucre, ça fait une pâte, mais sans le grammage, on ne peut pas dire a priori si ce sera savoureux, ou seulement comestible.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Excuses moi, mais je n'ai pas compris ta réponse ?

    Mais peut-être que mon message précédent n'était pas très clair ?

    Citation Envoyé par N_BaH Voir le message
    on ne peut pas valider un traitement de données sans données.

    des œufs, de la farine, du beurre et du sucre, ça fait une pâte, mais sans le grammage, on ne peut pas dire a priori si ce sera savoureux, ou seulement comestible.
    Les données que je ramène sont les taux d'occupations des points de montages (envoyés par la commande Linux "df" et formatées par AWK. Du coup, je suis bein obligé d'exécuper le "df|awk..." sur chaque serveur (connecté via "ssh") avant de les ramener pour les agréger ?

    Bonne soirée,
    Marco.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 339
    Par défaut
    Non,
    Le mieux, c'est de ne faire qu'un seul ssh par serveur, de lui dire d'executer les 2 commandes (ici df et vmstat) en intégrant une ligne avec un message qui te permettra de savoir si tu es sur le résultat du df ou celui du vmstat.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh -p $port $machine "df; echo FIN_DF ; vmstat 1 2 -S M"
    Et c'est le résultat que tu traites en local avec ton/tes awk

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Bonjour,

    Comment peux tu traiter deux commandes avec deux awk en même temps en sortie de ton appel SSH. c'est ce que j'ai du mal à saisir.
    En m'excusant de mon inexpérience.

    Cordialement,
    Marco.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Bonjour,

    Après quelques recherches sur l'exécution de commandes via SSH, je vous propose la syntaxe suivante pour obtenir une sorte de bilan de santé de plusieurs machines.

    Pourriez vous me dire si cela est possible :

    - S'exécuter sur une liste de machines distantes (liste passée en paramètre dans un fichier texte),
    - Récupérer le résultat et le concaténer,
    - Pour ensuite envoyer ce résultat par email.

    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
     
     
    #!/bin/bash
    #----------------------
    # SYNTAXE DE SSH :
    #----------------------
    #	VAR1="Variable 1"
    #	ssh $HOST bash -c "'
    #	ls
    #	pwd
    #	if true; then
    #    	echo $VAR1
    #	else
    #    	echo "False"
    #	fi
    #	'"
    #----------------------
    #	Espace disque occupés de tous les FS d'une machine (seuils d'alerte et d'erreur en paramètres à changer)
    #	MC le 01/10/2019
    #----------------------
     
    # Variables
    fichier="test.txt"		#Fichier en entrée
     
    seuilerr=90             #Seuil d'erreur a*modifier (poucentage d'occupation du disque)
    seuilwarn=70    		#Seuil de warning a*modifier (poucentage d'occupation du disque)
     
    email="mon.adresse.email.fr"
     
    while IFS= read -r ligne
    do
     
    	machine="root@"$ligne		
     
    	#Ouverture du canal pour exécution distante
    	ssh -p $machine bash -c 
    		"'
    		# Espace disque disponible : gestion des alertes
    		dfree=df -Pm | awk -v err=$seuilerr -v att=$seuilwarn '
    		NR>1 {total+=$2; utilise+=$3; dispo+=$4;
    			if (+$5>err){printf " => ALERTE  : %15s OCCUPE A : %4d% KO\n", $6, $5 }
    			else if (+$5>att){printf " => WARNING : %15s OCCUPE A : %4d% OK\n", $6, $5 }
    			else {printf " => NOTE    : %15s OCCUPE A : %4d% OK\n", $6, $5 }}
    		END{print " => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo"}'
     
    		# Mémoire disponible : pour information
    		mfree=vmstat 1 2 -S M | awk 'END {print " => Disponibilité du CPU : "$15"% - Mémoire disponible : "$4" Mo"}'	
    		'"
     
    	message="\n
    	###################\n
    	Nom de la machine : $machine . \n
    	###################\n
    	$dfree  \n 
    	$mfree  \n"
     
    	# Programme principal
    	if [ $(echo $dfree | grep -c ALERTE) -gt 0 ]
    	then
    		echo -e "$message" | /usr/bin/mutt -x -s "Espace disque presque sature sur : " . $machine $email >/dev/null 2>&1
    	fi
     
    done < "$fichier"
     
     
    # Fin
    exit 0
    Par avance merci.

    Cordialement,
    Marco.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Non,
    Le mieux, c'est de ne faire qu'un seul ssh par serveur, de lui dire d'executer les 2 commandes (ici df et vmstat) en intégrant une ligne avec un message qui te permettra de savoir si tu es sur le résultat du df ou celui du vmstat.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh -p $port $machine "df; echo FIN_DF ; vmstat 1 2 -S M"
    Et c'est le résultat que tu traites en local avec ton/tes awk
    Alors j'ai essayé de faire et mon code ne marche pas. Qui pourrait m'aider s'il vous plaît ?

    Voici la partie AWK de mon code (je l'ai volontairement sorti du script BASH).

    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
     
    ...
    	ssh $machine "df; echo FIN_DF ; vmstat 1 2 -S M" > awk -v err=$seuilerr -v att=$seuilwarn '
    	{
    	(NR > 1) {
    		total+=$2; utilise+=$3; dispo+=$4;
    		do {
    			if (+$5>err){
    				printf " => ALERTE  : %15s OCCUPE A : %4d% KO\n", $6, $5 
    			}
    			else if (+$5>att){
    				printf " => WARNING : %15s OCCUPE A : %4d% OK\n", $6, $5 
    			}
    			else {
    				printf " => INFO    : %15s OCCUPE A : %4d% OK\n", $6, $5 
    			}	
    		} while ($1<>"FIN_DF")
    	}
    	END {print " => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo\n => Disponibilité du CPU : "$15"% - Mémoire disponible : "$4" Mo"})
    	}' >> "suivi"$madate.txt
    ...
    Par avance je vous remercie.

    Cordialement,
    Marco.

  12. #12
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Bonjour

    Citation Envoyé par cotmar Voir le message
    ssh $machine "df; echo FIN_DF ; vmstat 1 2 -S M" > awk -v err=$seuilerr -v att=$seuilwarn '
    On ne redirige pas vers une commande.
    Soit on redirige vers un fichier.
    Soit on utilise une conduite (pipe) vers une commande.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Merci pour cette réponse. En effet, c'est une erreur que j'avais laissé passer.

    J'ai donc isolé la commande et je la teste à partir d'un serveur, vie SSH, vers celui que je souhaite interroger et voici ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [root] #ssh monserveur000001 "df; echo FIN_DF ; vmstat 1 2 -S M" | awk '{NR>1 {total+=$2; utilise+=$3; dispo+=$4;do {if (+$5>90){printf " => ALERTE  : %15s OCCUPE A : %4d% KO\n", $6, $5 }else if (+$5>70){printf " => WARNING : %15s OCCUPE A : %4d% OK\n", $6, $5 }else {printf " => INFO    : %15s OCCUPE A : %4d% OK\n", $6, $5 }} while ($1 != FIN_DF)}END {print " => Taille totale du disque : " total " Mo - Utilisee : " $utilise " Mo - dispo : " $dispo " Mo\n => Disponibilité du CPU : "$15"% - Mémoire disponible : "$4" Mo"}}'>>"suivi"
    awk:        
    awk:       ^ syntax error
    awk:
    awk:                                                                                                                                                                                                                                                                                      ^ syntax error

  14. #14
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'condition {action;} condition {action;} condition {action;} condition {action;}'
    Quand la condition est dans le bloc d'instructions sans "if", c'est déjà un problème.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Non,
    Le mieux, c'est de ne faire qu'un seul ssh par serveur, de lui dire d'executer les 2 commandes (ici df et vmstat) en intégrant une ligne avec un message qui te permettra de savoir si tu es sur le résultat du df ou celui du vmstat.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh -p $port $machine "df; echo FIN_DF ; vmstat 1 2 -S M"
    Et c'est le résultat que tu traites en local avec ton/tes awk

    En fait, je cherche à exécuter plusieurs commandes sur un ou des serveurs distants en SSH et à la piper en AWK. On m'a donc conseillé cette syntaxe.

    Ce qui implique :
    1) de faire un WHILE dans un bloc pour pouvoir afficher le résultat de la commande DF jusqu'à la position dans le résultat délimitée par le FIN_DF,2) de séparer en trois cas : ALERTE, WARNING et INFO en fonction du degré de gravité, d'où le IF/ELSE IF/ELSE à l'intérieur du bloc.
    3) de faire exécuter à la fin l'affichage du résultat de la commande VMSTAT.

    Le but de cette commande est d'obtenir une sorte de bilan de santé de mes serveurs.

    En espérant avoir été clair. Pourrais-tu m'aider à y voir plus clair s'il te plaît ?

    Par avance merci,
    Marco.

  16. #16
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    NR>1 est une condition. Toi, tu l'as mise comme instruction (comme je t'avais cité), en mettant une accolade avant. L'accolade est de trop. Je n'ai pas lu plus loin.

    Si tu ne comprends toujours pas, lis un tutoriel sur awk. Voire le Gawk Manual.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Voilà j'ai bien compris mon erreur et je te remercie de me l'avoir signalée pour le NR>1 et comme je te le disais plus haut, à 14H54 et j'ai enlevé l'accolade.
    Mais ça ne répond pas à ma question ?

  18. #18
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 339
    Par défaut
    Voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ echo -e "df ligne 1\ndf ligne2\ndf ligne3\nFIN_DF\nvmstat ligne1\nvmstat ligne2\nvmstat ligne3" | awk '
    /FIN_DF/ { FIN_DF=1 ; next}
    NR > 1 && ! FIN_DF { print "ici df:",$0}
    FIN_DF { print "ici vmstat:",$0 }
    END { print "fin de tout" }'
    ici df: df ligne2
    ici df: df ligne3
    ici vmstat: vmstat ligne1
    ici vmstat: vmstat ligne2
    ici vmstat: vmstat ligne3
    fin de tout
    Plus qu'à transposer

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Bonjour,

    Après être resté quelques temps silencieux, je me permets de poster la dernière version de mon script, qui a pas mal évolué depuis la dernière fois.
    Je vous remercie d'ailleurs de tous vos conseils fort judicieux.

    Donc pour rappel :

    - je fourni en arguments un email et un fichier contenant une liste de serveurs,
    - j'exécute via SSH les commandes DF et VMSTAT,
    - je formate les résultats au moyen de la commande AWK,
    - Je retourne le "bilan de santé" des serveurs en question en format HTML

    Au vu de vos retours, j'ai décidé de séparer le SSH et la commande AWK.

    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
     
    #!/bin/bash
    #----------------------
    # SYNTAXE DE SSH :
    #----------------------
    #	VAR1="Variable 1"
    #	ssh $HOST bash -c "'
    #	ls
    #	pwd
    #	if true; then
    #    	echo $VAR1
    #	else
    #    	echo "False"
    #	fi
    #	'"
    #----------------------
    #
    #	Argument 1 :	nom du fichier contenant la liste des serveurs à interroger
    #	Argument 2 :	adresse email vers laquelle envoyer le résultat
    #
    #----------------------
    #	Espace disque occupés de tous les FS d'une machine (seuils d'alerte et d'erreur en paramètres à changer)
    #	MC le 01/10/2019
    #----------------------
     
    #Constantes
    SYNOPSIS="USAGE : $0 fichier email"
     
    # Variables
    ###########
    # Arguments passés au script
    nbargs=$#
    fichier=$1		#Fichier en entrée exemple "test.txt"
    email=$2		#Email d'envoi du rapport
     
    # Pourcentage d'occupation du disque
    seuilerr=90     #Seuil d'erreur a*modifier 
    seuilwarn=70    #Seuil de warning a*modifier
     
    # Document HTML
    htmltetedoc="<!doctype html>
    <html lang=\"fr\">
    <head>
      <meta charset=\"utf-8\">
      <title>Rapport de la machine : ".$machine."</title>
    </head>
    <body>"
    htmlfindoc="#</body>
    </html>"
     
    # Fonctions
    ###########
    usage()
    {
    	echo -e "$1"
    	exit $2
    }
     
    f_estFichier()
    {
    	local retour=0
     
    	if [[ -f $fichier ]] 
    	then
    		retour=1
    	fi
    	echo "$retour"
    }
     
    f_estEmail()
    {
    	local retour=0
    	local l_regex="[a-z0-9]+[\.a-z0-9\-]*@[a-z0-9]+[\.a-z0-9\-]*"
     
    	if [[ $email=~$l_regex ]] 
    	then
    		retour=1
    	fi
    	echo "$retour"
    }
     
    # Programme principal
    #####################
     
    # Gestion des erreurs
    if [ "$nbargs" -ne 2 ]
    then
    	usage "$0 : Nombre d'arguments invalide\n
    		\n
    		$SYNOPSIS" 80
    elif [ $(f_estFichier $fichier) -eq 0 ]
    then
    	usage "$1 : Argument 1 fichier absent ou endommagé\n
    	   \n
    	   $SYNOPSIS" 81
    elif  [ $(f_estEmail $email) -eq 0 ]
    then
    	usage "$2 : Argument 2 n'est pas un email valide\n
    	   \n
    	   $SYNOPSIS" 82
    fi
     
    madate=$(date '+%d-%m-%Y')
     
    echo $htmltetedoc >> "bulletinDeSanteLe-"$madate".txt"
     
    # Traitement principal
    while IFS= read -r ligne
    do
    	machine="root@"$ligne		
     
    	echo -e "<br/>
    	###################<br/>
    	Nom de la machine : $machine - $madate <br/>
    	###################<br/>"
     
    	#Exécution sur les machines distantes en SSH
    	ssh root@$machine "df -Pm; echo FIN_DF ; vmstat 1 2 -S M">/tmp/tempo.txt
     
    	#Mise en forme texte dans le AWK
    	cat /tmp/tempo.txt | awk  -v err=$seuilerr -v att=$seuilwarn '
    	/FIN_DF/ {FIN_DF=1 ; next}
    	NR > 1 && +$5>=90  && ! FIN_DF {printf "<td> => ALERTE  : %15s OCCUPE A : %4d% </td><td><font color =\"red\">KO</font></td><br/>", $6, $5} 
    	NR > 1 && +$5>=70  && ! FIN_DF {printf "<td> => WARNING : %15s OCCUPE A : %4::md% </td><td><font color =\"orange\">OK</font></td><br/>", $6, $5}
    	NR > 1 && +$5<=70  && ! FIN_DF {printf "<td> => INFO    : %15s OCCUPE A : %4d% </td><td><font color =\"gree\">OK</font></td></br>", $6, $5}
    	END{print "<td> => Disponibilité du CPU : "$15"%  </td><td> Mémoire disponible : "$4" Mo"}o</td><br/>'>> "bulletinDeSanteLe"$madate".txt"
     
    done < "$fichier"
     
    echo $htmlfindoc >> "bulletinDeSanteLe-"$madate".txt"
     
    #Envoi de l'alerte si le buletin est mauvais
    if [ $(cat "bulletinDeSanteLe-"$madate".txt" | grep -c ALERTE) -gt 0]
    then
    	cat "bulletinDeSanteLe-"$madate".txt" | /usr/bin/mutt -x -s "Espace disque presque sature sur : " . $machine $email >/dev/null 2>&1
    fi
     
     
    # Fin
    #####
    exit 0
    Pourriez vous me dire ce que vous en pensez ?

    Par avance merci.

    Marco.

  20. #20
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 339
    Par défaut
    Je n'ai regardé que la partie fonctionnelle de ton script et je pense que ceci fonctionnerait (pas testé) et un peu plus simple à comprendre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	ssh root@$machine "vmstat 1 2 -S M ; df -Pm">/tmp/tempo.txt
     
    	#Mise en forme texte dans le AWK
    	awk  -v err=$seuilerr -v att=$seuilwarn '
    	NR == 4 {CPU=$15;MEM=$4}
    	NR > 5 && +$5>=90  {printf "<td> => ALERTE  : %15s OCCUPE A : %4d% </td><td><font color =\"red\">KO</font></td><br/>", $6, $5} 
    	NR > 5 && +$5>=70  {printf "<td> => WARNING : %15s OCCUPE A : %4::md% </td><td><font color =\"orange\">OK</font></td><br/>", $6, $5}
    	NR > 5 && +$5<=70  {printf "<td> => INFO    : %15s OCCUPE A : %4d% </td><td><font color =\"gree\">OK</font></td></br>", $6, $5}
    	END{print "<td> => Disponibilité du CPU : "CPU"%  </td><td> Mémoire disponible : "MEM" Mo"}o</td><br/>' /tmp/tempo.txt >> "bulletinDeSanteLe"$madate".txt"
    Ici, j'ai modifié l'ordre d'appel des commandes dans ssh, virer le cat INUTILE et modifié le awk (car ici on connait le nombre de ligne du vmstat contrairement à df)

Discussions similaires

  1. Appels de commandes DOS dans sqlplus
    Par daniel7 dans le forum Sql*Plus
    Réponses: 2
    Dernier message: 17/11/2008, 18h48
  2. Appeller des commandes unix dans du PL/SQL
    Par stepd dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/03/2008, 14h52
  3. Appeler une commande nommée dans une variable
    Par kwakanar dans le forum Programmation (La)TeX avancée
    Réponses: 1
    Dernier message: 03/03/2008, 15h29
  4. commande awk dans script perl
    Par sorilazer dans le forum Langage
    Réponses: 3
    Dernier message: 19/07/2007, 10h16
  5. Réponses: 1
    Dernier message: 14/03/2007, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo