Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/01/2016, à 11:23

Alcatraz62

Récuperation complexe d'informations (grep,awk,cut,sed,find)

Bonjour, je suis débutant dans tout ça, et je galère depuis 2jours en stage et j'aimerais un peu d'aide si possible.

Je m'explique, avec un nom d'Hôte connu je dois recuperer les informations sur cet hôte dans un fichier qui contient une centaine d'Hôtes

le fichier  /etc/../../hosts.cfg se prèsente comme ceci:

define host {
                   host_name SW_nom (le nom que je connais a la base)
                   addresse 0.0.0.0
                    parents FW_nom
                     ....
                     ...
}

Je dois donc récupérer dans un variable ou un fichier tout le bloc se situant entre les { } et dont le nom d'Hôte (host_name) est SW_nom..
Et déjà là je bloque.

Ensuite dans cette variable ou fichier, le dois récuperer la ligne "parents FW_nom" dans un autre variable ou fichier (ici la commande grep est assez facile pour ça).

Mais ensuite sa se complique de nouveau:

Dans " parents FW_nom" je dois recupérer le "FW_nom" dans une autre variable en sachant qu'il commence obligatoirement par "FW_" cependant il y as des espaces au début et au millieu de la ligne dont le nombre peut varier.
J'ai essayé avec la commande cut mais je ne connais pas du tout les symboles et tout, enfin je n'ai pas réussis du tout quoi


Ensuite je dois dans le même fichier hosts.cfg qu'au début, récuperer l'adresse IP de l'Hôte que je viens de recuperer juste avant dans le "parent" du premier Hôte ( donc recuperer l'adresse de l'Hôte FW_nom)

J'espère avoir été assez clair, si vous voulez d'avantages d'informations n'hésitez pas.

Je vous remercie d'avance car je n'avance pas du tout et je suis donc bloqué pour la suite de mon stage.

Hors ligne

#2 Le 21/01/2016, à 11:59

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Bonjour,
Pour récupérer le bloc contenant SW_nom :

sed -n '/define host {/{h;b};/}/!{H;b};H;x;/SW_nom/p' fichier

Pour le reste, tu devrais donner un exemple précis.

Hors ligne

#3 Le 21/01/2016, à 12:21

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Merci de ta reponse, pour le stocker dans une variable je met juste "variable= ta commande" ?

nomhost='SW_test'

infohost= sed -n '/define host {/{h;b};/}/!{H;b};H;x;/$nomhost/p' /srv/eyesofnetwork/nagios/etc/objects/hosts.cfg

echo "$infohost"

Ne me renvoie rien du tout, mais le nom FW_test existe bien dans mon fichier hosts.cfg.

Ensuite dans le bloc obtenu, avec grep je recupère une seule ligne:
"         parents   FW_nom"
Et dans cette ligne je souhaite récuperer uniquement le "FW_nom", se que je dois recuperer commence forcement par "FW_" mais il y as des espaces au début de lignes et il peut y avoir 1-2-3espaces entre "parents" et "FW_nom"

Et pour finir avec le "FW_nom" récupéré, je dois de nouveau faire une commande un peu comme celle que tu viens de donner, pour faire simple le "FW_nom" récupéré fais reference à  autre Hôte du fichier host.cfg

Donc je dois maintenant récuperer le bloc de se nouveau hôte (FW_nom) et c coup ci, avec grep récuperer son adresse IP dans le bloc obtenu.

Je dois au final concrètement avec se script automatiser le fais qu'en recevant le nom d'un hôte en agument, je reussise a récuperer l'adresse IP du parent de cet hôte.
Et ensuite je me connecte en ssh sur cette adresse IP pour y effectuer une commande ( mais cette partie est déjà réalisée smile )

J'espère avoir étais clair smile

Hors ligne

#4 Le 21/01/2016, à 12:38

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

infohost=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/'$nomhost'/p' /srv/eyesofnetwork/nagios/etc/objects/hosts.cfg)

Hors ligne

#5 Le 21/01/2016, à 13:20

Watael

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

salut,

pingouinux, elle est bizarre* ta commande, et j'ai l'impression qu'elle ne fonctionne pas : si j'ajoute des hôtes au fichier, et en incrémentant SW_nom, elle affiche tout le fichier. sad

*je ne comprends même pas que sed ne me jette pas hmm


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 21/01/2016, à 14:09

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Bonjour Watael,
Je l'ai pourtant testée, mais effectivement pas correctement.

$ cat fichier
define host {
                   host_name SW_nom (le nom que je connais a la base)
                   addresse 0.0.0.0
                    parents FW_nom
                     ....
                     ...
}
define host {
                   host_name TW_nom (le nom que je connais a la base)
                   addresse 0.0.0.0
                    parents FW_nom
                     ....
                     ...
}
define host {
                   host_name UW_nom (le nom que je connais a la base)
                   addresse 0.0.0.0
                    parents FW_nom
                     ....
                     ...
}

$ infohost=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/'$nomhost'/p' fichier)

$ echo "=$infohost="
=define host {
                   host_name SW_nom (le nom que je connais a la base)
                   addresse 0.0.0.0
                    parents FW_nom
                     ....
                     ...
}=

Ce serait plus correct ainsi

infohost=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/'" $nomhost "'/p' fichier)

pour ne pas détecter une chaîne qui contient $nomhost.

Hors ligne

#7 Le 21/01/2016, à 14:22

Watael

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

au temps pour moi.
c'est toutes ces accolades, qui m'empêchent de lire la commande correctement.
en plissant un peu les yeux, ça va mieux. sad


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 21/01/2016, à 14:40

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Merci pingouinux ! smile

Sa m'aide déjà enormement!

Juste si l'on pouvais m'aider pour récuperer juste le "FW_test" après avoir récuperer la ligne   "       parents  FW_test" ?
Recupere la ligne avec grep c'est assez facile, mais je n'arrive pas à utiliser cut correctement, à moin qu'il faille utiliser une autre commande ?

Ensuite j'adapterais t'as première commande pour le peu qu'il me resteras a faire.

Merci d'avance smile

Hors ligne

#9 Le 21/01/2016, à 14:49

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

awk '/parents FW/{print $2}' <<<"$infohost"

et pour mettre le résultat dans une variable

variable=$(awk '/parents FW/{print $2}' <<<"$infohost")

Hors ligne

#10 Le 21/01/2016, à 14:52

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Merci à toi, je n'aurais jamais réussis je pense smile

Hors ligne

#11 Le 21/01/2016, à 17:59

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Pour récupérer la même information sans passer par l'intermédiaire de la variable infohost :

variable=$(awk '/define host {/{ok=0}/ '"$nomhost"' /{ok=1}/parents FW/{if(ok)print $2}' fichier)

Hors ligne

#12 Le 22/01/2016, à 16:03

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Bonjour,
Désolé de revenir vers vous mais j'ai un petit soucis a cause d'une des commande, j'ai pas pu tout tester hier ( nous avons eu un soucis serveur).

Voici mon "script" qui est encore en test bien entendu smile

#!/bin/bash

nomhost='SW_test'

infohost=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/'$nomhost'/p' /srv/eyesofnetwork/nagios/etc/objects/hosts.cfg)
echo "$infohost"     (Ici j'ai bien le bloc souhaité)   

lignep=$(grep parents <<< "$infohost")
echo "$lignep" [color=#f0210a]( Ici de même, j'obtiens ma ligne "         parents  FW_test" )

nomparent=$(sed '/parents/,/\}/ !d ; /parents/ !d ; s/.*\ //' <<< "$lignep")
echo "$nomparent"      (Ici mon "FW_test" est bien pris")  

infoparent=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/'$nomparent'/p' /srv/eyesofnetwork/nagios/etc/objects/hosts.cfg)
echo "$infoparent"     (Cependant ici la commande ne me sélectionne pas le bloc FW_test, mais tout le fichier hosts.cfg...)  

Je comprend pas vraiment étant donné que c'est exactement la même commande que la premiere, en modifiant juste le nom d'hôte voulu..

Mon "FW_test" est le premier Hôte de mon fichier hosts.cfg, du coup je suppose que la } de sortie de sed est la derniere du fichier ?
En sachant qu'au final le fichier hosts.cfg contiendras une 100ène d'hôte il ne faudrait pas avoir se type de problèmes, car tout devras fonctionner niquel..

Merci d'avance, et désolé de ma nullité tongue

Dernière modification par Alcatraz62 (Le 22/01/2016, à 16:18)

Hors ligne

#13 Le 22/01/2016, à 16:34

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Le nom que tu testes est peut-être inclus dans celui des autres blocs (par exemple s'ils contiennent FW_test1).
Essaye :

infoparent=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/\<'$nomparent'\>/p' /srv/eyesofnetwork/nagios/etc/objects/hosts.cfg)

Hors ligne

#14 Le 22/01/2016, à 16:47

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Effectivement j'avais FW_test / SW_test et FW_test2 dans mon fichier..

Cependant ça peut poser problème, car plus tard quand tout les vrais hôtes seront dans le fichier il pourras possiblement y avoir par exemple "FW_LYON_SUD" et FW_LYON_NORD" et de même avec Paris, il se pourrais que celà pose probleme au vu de la commande ?
Ou il ne me prendras que strictement "FW_LYON_NORD comme bloc ?

Merci

Hors ligne

#15 Le 22/01/2016, à 16:50

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Après modification et changement du nom je viens de comprendre..

Mon premier hôte "FW_test" que je veux sélectionner est dans la description de mon dernier dans la ligne "parents FW_test" et du coup sa pose problème, car il y auras forcement plusieurs noms égaux dans le fichier hosts final sad

Hors ligne

#16 Le 22/01/2016, à 16:58

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Il faut que tu définisses exactement ce que tu veux, et que tu montres le fichier de départ. Je pense qu'il sera plus simple d'utiliser awk.

Hors ligne

#17 Le 22/01/2016, à 16:59

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Mon script "final" devrais environ ressembler a ça si sa peut mieux expliquer..

#!/bin/sh

nomhost=$1
pw=$2

infohost=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/'$nomhost'/p' /srv/eyesofnetwork/nagios/etc/objects/hosts.cfg)
echo "$infohost"

lignep=$(grep parents <<< "$infohost")
echo "$lignep"

nomparent=$(sed '/parents/,/\}/ !d ; /parents/ !d ; s/.*\ //' <<< "$lignep")
echo "$nomparent"

infoparent=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/'$nomparent'/p' /srv/eyesofnetwork/nagios/etc/objects/hosts.cfg)
echo "$infoparent"

lignea=$(grep address  <<< "$infohost")
echo "$lignea"

adr=$(sed '/address/,/\}/ !d ; /address/ !d ; s/.*\ //' <<< "$lignea")
echo "$adr"

###########################################################################################################

sshpass -p "$pw" ssh -o StrictHostKeyChecking=no admin@$adr 'envpn 00 && envpn 01'

echo "$(date)  Script lancé  " >> /srv/eyesofnetwork/nagios/plugins/eventhandlers/log.txt

$1 et $2 sont les argumùents qui sont reçu par mon script a son lancement, c'est un lancement automatique par nagios smile

Hors ligne

#18 Le 22/01/2016, à 17:02

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Mon fichier Host.cfg final je ne peux pas le connaitre, ce seras FW_LYON, FW_PARIS, FW_BORDEAUX...etc avec une 100ène de FW mais aussi d'autres hôtes..

Hors ligne

#19 Le 22/01/2016, à 17:15

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Pour être clair chaque Firewall (FW) à un switch (SW) derriere lui, chaques fois que nagios ne ping plus le switch, il lance mon script afin de réactualiser le vpn et donc retablir la liaison avec le switch.

Chaque switch à un FW en parent dans le fichier hosts..

Tout dois être automatisé pour que lorsque mon script seras mis sur le vrai serveur nagios, cela fonctionne quelques soit les hôtes dans mon fichier, les adresse, les mots de passe...etc

C'est la galère total je sais, mais je suis stagiaire et pas le choix de faire se que l'ont me dis sad

Hors ligne

#20 Le 22/01/2016, à 18:44

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Apparemment, tu n'utilises que l'adresse, tu n'as besoin que de ça (c'est un script bash, pas sh) :

#!/bin/bash

nomhost=$1
pw=$2

fichier=/srv/eyesofnetwork/nagios/etc/objects/hosts.cfg
infohost=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/\<host_name '"$nomhost"'\>/p' "$fichier")
echo infohost="$infohost"=

nomparent=$(awk '/\<parents\>/{print $2}' <<< "$infohost")
echo nomparent="$nomparent"=

adr=$(awk '/\<addresse\>/{print $2}' <<< "$infohost")
echo adr="$adr"=

###########################################################################################################

sshpass -p "$pw" ssh -o StrictHostKeyChecking=no admin@$adr 'envpn 00 && envpn 01'

echo "$(date)  Script lancé  " >> /srv/eyesofnetwork/nagios/plugins/eventhandlers/log.txt

Édité : Correction pour ne récupérer le bloc que si nomhost apparaît sur la ligne contenant host_name.

Dernière modification par pingouinux (Le 23/01/2016, à 09:22)

Hors ligne

#21 Le 25/01/2016, à 10:19

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Bonjour
Malheureusement sa ne fonctionne pas, j'obtiens

infohost==
nomparent==
adr==

là je ne comprend vraiment pas pourquoi, il ne me signale pas d'erreurs de commandes mais ne me récupère rien du tout..

Hors ligne

#22 Le 25/01/2016, à 11:07

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Dans ce cas, il faut que tu montres le fichier de départ (au moins la partie qui contient le bloc qui t'intéresse), et la façon dont tu appelles le script.

Hors ligne

#23 Le 25/01/2016, à 11:19

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

le fichier:

# Written by NagiosHostExporter from Eonweb Configurator 2.4 on December 22, 2015, 9:20 am

define host {
    host_name    SW_test
    alias  FW
    address  11.0.0.0
    display_name    SW_test
    check_command   check-host-alive
  max_check_attempts      1
  check_interval  4
  passive_checks_enabled  1
  check_period    24x7
  obsess_over_host        0
  check_freshness 0
  freshness_threshold     0
  active_checks_enabled   1
  notification_interval   0
  notification_period     24x7
  notifications_enabled   1
  failure_prediction_enabled      1
  action_url      /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_
  icon_image      firewall.png
  vrml_image      firewall.png
  statusmap_image firewall.png
  notification_options    d,u,r,f,s
  stalking_options        o,d,u
  contact_groups  admins
  contacts        admin
  hostgroups      NETASQ
  parents  FW_test
}

define host {
    host_name     FW_tototototo
    alias   Netasq U120
    address    195.101.136.242
    display_name    FW_test
    check_command   check-host-alive
  max_check_attempts      2
  check_interval  4
  passive_checks_enabled  1
  check_period    24x7
  obsess_over_host        0
  check_freshness 0
  freshness_threshold     0
  active_checks_enabled   1
  notification_interval   0
  notification_period     24x7
  notifications_enabled   1
  failure_prediction_enabled      1
  action_url      /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_
  icon_image      firewall.png
  vrml_image      firewall.png
  statusmap_image firewall.png
  notification_options    d,u,r,f,s
  stalking_options        o,d,u
  contact_groups  admins
  contacts        admin
  hostgroups      NETASQ
  parents  FW_toto
}

define host {
    host_name    FW_test
    alias   Netasq U120
    address    192.110.255.44
    display_name    FW_test
    check_command   check-host-alive
  max_check_attempts      2
  check_interval  4
  passive_checks_enabled  1
  check_period    24x7
  obsess_over_host        0
  check_freshness 0
  freshness_threshold     0
  active_checks_enabled   1
  notification_interval   0
  notification_period     24x7
  notifications_enabled   1
  failure_prediction_enabled      1
  action_url      /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_
  icon_image      firewall.png
  vrml_image      firewall.png
  statusmap_image firewall.png
  notification_options    d,u,r,f,s
  stalking_options        o,d,u
  contact_groups  admins
  contacts        admin
  hostgroups      NETASQ
}



Le script actuellement je l'appel manuellement par "./nomduscript"

J'attend qu'il fonctionne avant de l'intégrer automatiquement dans Nagios avec les arguments et tout..

Et mon script "test" actuellement c'est ça:

#!/bin/bash

nomhost='SW_test'

echo "$nomhost"

fichier=/srv/eyesofnetwork/nagios/etc/objects/hosts.cfg

infohost=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/'$nomhost'/p' $fichier)
echo "$infohost"


lignep=$(grep parents <<< "$infohost")
echo "$lignep"


nomparent=$(sed '/parents/,/\}/ !d ; /parents/ !d ; s/.*\ //' <<< "$lignep")
echo "$nomparent"


infoparent=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/'$nomparent'/p' $fichier)
echo "$infoparent" ( c'est ici que sa ne fonctionne plus et je ne comprend pas pourquoi :(


lignea=$(grep address  <<< "$infohost")
echo "$lignea"


adr=$(sed '/address/,/\}/ !d ; /address/ !d ; s/.*\ //' <<< "$lignea")
echo "$adr"

Merci du temps que tu passe à m'aider, vraiment c'est super cool smile


Edit : ajout de balises

Dernière modification par cqfd93 (Le 25/01/2016, à 11:32)

Hors ligne

#24 Le 25/01/2016, à 11:44

pingouinux

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Alcatraz62 #22 a écrit :

Malheureusement sa ne fonctionne pas

C'est parce que la structure du fichier n'est pas la même que celle de ton exemple en #1 :
- il y a maintenant plusieurs espaces après nom_host
- tu es passé de addresse (incorrect en français et en anglais) à address (version anglaise)
Voici le script corrigé qui devrait tenir compte de ces modifications :

#!/bin/bash

nomhost=$1
pw=$2

fichier=/srv/eyesofnetwork/nagios/etc/objects/hosts.cfg
infohost=$(sed -n '/define host {/{h;b};/}/!{H;b};H;x;/\<host_name \+'"$nomhost"'\>/p' "$fichier")
echo infohost="$infohost"=

nomparent=$(awk '/\<parents\>/{print $2}' <<< "$infohost")
echo nomparent="$nomparent"=

adr=$(awk '/\<add?resse|address\>/{print $2}' <<< "$infohost")
echo adr="$adr"=

###########################################################################################################

sshpass -p "$pw" ssh -o StrictHostKeyChecking=no admin@$adr 'envpn 00 && envpn 01'

echo "$(date)  Script lancé  " >> /srv/eyesofnetwork/nagios/plugins/eventhandlers/log.txt

Remarque : Pour plus de lisibilité, merci de placer les résultats entre balises-code <>

Hors ligne

#25 Le 25/01/2016, à 11:59

Alcatraz62

Re : Récuperation complexe d'informations (grep,awk,cut,sed,find)

Le "addresse" étais une faute de frappe, désolé !

Pour les espaces c'est une auto incrémentation avec "tab" donc le nombre d'espaces n'est pas forcement régulier, sa peut en être 2 à la ligne "address" mais 3 à la ligne "parents"..

Je me trompe peut être mais avec le script que tu viens d'envoyé on récupère l'adresse de l'Hôte que l'on reçoit en paramètre ?

La récupération du nomparent sert à rechercher l'Hôte "parent" pour ensuite avoir son adresse, il manque donc une ligne non ?

Hors ligne