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/04/2022, à 10:18

DrussLaLegende

[Résolu]-[AWK][BASH] saut de ligne à chaque boucle

Bonjour,

(Je tiens à préciser que je suis débutant en programmation et autodidacte)

Je souhaite créer un petit programme afin de remplir automatique un fichier de configuration pour simuler des chiffreurs.
Chaque chiffreur a son propre fichier de configuration (ipsec-tools.conf) avec les informations pour créer des "liaisons" avec les autres chiffreurs.
J'ai un fichier en .csv (donnees.csv) sur lequel chaque ligne correspond a un chiffreur avec ses informations.

numéro,nom chiffreur,Numéro chiffreur,adresse réseau chiffreur clair,masque,CIDR,adresse ip chiffreur chiffré,masque,CIDR
1,CHIF4,04,192.168.1.0,255.255.255.0,24,10.0.1.20,255.255.255.0,24
2,CHIF8,18,192.168.2.0,255.255.255.0,24,10.0.2.20,255.255.255.0,24
3,CHIF20,20,192.168.3.0,255.255.255.0,24,10.0.3.20,255.255.255.0,24

J'utilise donc donnees.csv pour renseigner les différentes informations donc le fichier de configuration a besoin.

J'avais créé cela manuellement avec AWK, en récupérant chaque information et en la plaçant dans une variable.

#!/bin/bash

FichierConf="/home/user/Documents/test1.csv" #fichier de configuration : le .csv
chemin="/home/user/Documents/" #chemin où sera placé les différents fichiers de configuration des chiffreurs
REP="ConfigRasp" #Répertoire contenant tous les dossiers des chiffreurs       


#variables pour le premier CHIF => CHIF1
NomCHIF1="$(awk -F"," 'NR==2 {print $2}' $FichierConf)"
NumCHIF1="$(awk -F"," 'NR==2 {print $3}' $FichierConf)"
IpCHIF1="$(awk -F"," 'NR==2 {print $4}' $FichierConf)"
MaskCHIF1="$(awk -F"," 'NR==2 {print $6}' $FichierConf)"
IpNCHIF1="$(awk -F"," 'NR==2 {print $7}' $FichierConf)"

#variables pour le deuxième CHIF => CHIF2
NomCHIF2="$(awk -F"," 'NR==3 {print $2}' $FichierConf)"
NumCHIF2="$(awk -F"," 'NR==3 {print $3}' $FichierConf)"
IpCHIF2="$(awk -F"," 'NR==3 {print $4}' $FichierConf)"
MaskCHIF2="$(awk -F"," 'NR==3 {print $6}' $FichierConf)"
IpNCHIF2="$(awk -F"," 'NR==3 {print $7}' $FichierConf)"

#variables pour le troisième CHIF => CHIF3
NomCHIF3="$(awk -F"," 'NR==4 {print $2}' $FichierConf)"
NumCHIF3="$(awk -F"," 'NR==4 {print $3}' $FichierConf)"
IpCHIF3="$(awk -F"," 'NR==4 {print $4}' $FichierConf)"
MaskCHIF3="$(awk -F"," 'NR==4 {print $6}' $FichierConf)"
IpNCHIF3="$(awk -F"," 'NR==4 {print $7}' $FichierConf)"

#Variables pour les tunnels :
CleAes12="0x"$(openssl rand -hex 16)
CleAes21=$CleAes12
CleHamac12="0x"$(openssl rand -hex 32)
CleHamac21=$CleHamac12
CleAes13="0x"$(openssl rand -hex 16)
CleAes31=$CleAes13
CleHamac13="0x"$(openssl rand -hex 32)
CleHamac31=$CleHamac13

Créer le fichier de configuration.
Puis en plaçant chaque variable à l'endroit voulu dans le fichier de configuration.
Et enfin envoyer le tout dans le fichier de configuration.

#création du fichier ipsec-tools pour le CHIF1
mkdir -p $chemin$REP"/"$NomCHIF1
touch $chemin$REP"/"$NomCHIF1/ipsec-tools.conf

#Remplissage du fichier ipsec-tools pour le CHIF1
echo "#mettre le ipsec-tools.conf dans /etc/
!/usr/sbin/setkey -f

#Flush des SPD et des SAD déjà présent
spdflush;
flush;

####$NomCHIF1####

###Security Policies SPD

#out : notre réseau vers les autres

##LAN $NomCHIF1 vers LAN $NomCHIF2
spadd $IpCHIF1"/"$MaskCHIF1 $IpCHIF2"/"$MaskCHIF2 any
	-P out ipesec
	esp/tunnel/$IpNCHIF1-$IpNCHIF2/require;

##LAN $NomCHIF1 vers LAN $NomCHIF3
spadd $IpCHIF1"/"$MaskCHIF1 $IpCHIF3"/"$MaskCHIF3 any
	-P out ipesec
	esp/tunnel/$IpNCHIF1-$IpNCHIF3/require;

#in : autres réseaux vers le notre

##LAN $NomCHIF2 vers LAN $NomCHIF1
spadd $IpCHIF2"/"$MaskCHIF2 $IpCHIF1"/"$MaskCHIF1 any
	-P out ipesec
	esp/tunnel/$IpNCHIF2-$IpNCHIF1/require;

##LAN $NomCHIF3 vers LAN $NomCHIF1
spadd $IpCHIF3"/"$MaskCHIF3 $IpCHIF1"/"$MaskCHIF1 any
	-P out ipesec
	esp/tunnel/$IpNCHIF3-$IpNCHIF1/require;

###Security Association SAD

#out :

##Tunnel du chiffreur $NomCHIF2 vers le chiffreur $NomCHIF1
add $IpNCHIF2 $IpNCHIF1 esp 0x$NumCHIF2$NumCHIF1
	-m tunnel
	-E aes-cbc $CleAes21
	-A hmac-sha256 $CleHamac21;

##Tunnel du chiffreur $NomCHIF3 vers le chiffreur $NomCHIF1
add $IpNCHIF3 $IpNCHIF1 esp 0x$NumCHIF3$NumCHIF1
	-m tunnel
	-E aes-cbc $CleAes31
	-A hmac-sha256 $CleHamac31;


#in :

##Tunnel du chiffreur $NomCHIF1 vers le chiffreur $NomCHIF2
add $IpNCHIF1 $IpNCHIF2 esp 0x$NumCHIF1$NumCHIF2
	-m tunnel
	-E aes-cbc $CleAes12
	-A hmac-sha256 $CleHamac12;

##Tunnel du chiffreur $NomCHIF1 vers le chiffreur $NomCHIF3
add $IpNCHIF1 $IpNCHIF3 esp 0x$NumCHIF1$NumCHIF3
	-m tunnel
	-E aes-cbc $CleAes13
	-A hmac-sha256 $CleHamac13;"   > $chemin$REP"/"$NomCHIF1/ipsec-tools.conf

Et ça X fois le nombre de chiffreur.

Cela fonctionne très bien mais cela n'est pas évolutif car si j'ai 8 chiffreurs j'ai besoin de créer 8 fichiers de conf et dans ces fichiers de conf il y aura à chaque fois X tunnel + X SAD + X SPD

J'ai donc commencé avec un petite partie du code pour essayer.
J'avais donc pensé à faire des boucles en fonction du nombre de ligne du fichier .csv, et de découper le fichier de configuration en plusieurs fonction, voilà ce que j'avais commencé à faire mais cela ne fonctionne pas.

Récupération du nombre de ligne via AWK :

NbrLigne="$(awk 'END {print NR -1} $FichierConf)"
NbrRep=0

Création d'une fonction :

fonction1()
{
echo "#mettre le ipsec-tools.conf dans /etc/
!/usr/sbin/setkey -f

#Flush des SPD et des SAD déjà présent
spdflush;
flush;

####"$(awk -F"," 'NR==2 {print $2}' $FichierConf)"#### <- ici j'aimerai que la variable se modifie à chaque boucle en gros que NR==3 lors de la prochaine boucle
}

while [ "$NbrRep" -lt "$NbrLigne" ]
do
     fonction1
     let "NbrRep+=1"
done
 

Il y a sûrement un moyen de le faire mais avec mes différentes recherches et maigres connaissances, je suis perdu.

Merci de votre aide et d'avoir pris le temps de me lire.
J'espère avoir été assez clair dans mes explications.

Druss

Dernière modification par DrussLaLegende (Le 25/04/2022, à 10:16)

Hors ligne

#2 Le 21/04/2022, à 10:40

iznobe

Re : [Résolu]-[AWK][BASH] saut de ligne à chaque boucle

Bonjour ,

####"$(awk -F"," 'NR==2 {print $2}' $FichierConf)"#### <- ici j'aimerai que la variable se modifie à chaque boucle en gros que NR==3 lors de la prochaine boucle
}

il faut donc integrer cette ligne de code a la boucle et utiliser la variable de la boucle qui s ' incremente , si j' ai bien compris , celle-ci :

$NbrRep

qui vaudra 0 au 1er tour de boucle , puis 1 au 2eme tour etc .

Pour commencer , c ' est plus simple de faire sans fonction , c ' est toujours piegeux cette histoire dans un boucle tongue :

while [ "$NbrRep" -lt "$NbrLigne" ]
do
     
	 echo "#mettre le ipsec-tools.conf dans /etc/
	 !/usr/sbin/setkey -f

	 #Flush des SPD et des SAD déjà présent
		spdflush;
		flush;

####"$(awk -F"," 'NR==2 {print $2}' $FichierConf)"
#### <- ici j'aimerai que la variable se modifie à chaque boucle en gros que NR==3 lors de la prochaine boucle 
#### essaie alors avec " NR=$NbrRep+1 "
     let "NbrRep+=1"
done

Dernière modification par iznobe (Le 21/04/2022, à 10:47)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#3 Le 21/04/2022, à 12:39

Watael

Re : [Résolu]-[AWK][BASH] saut de ligne à chaque boucle

salut,

je ne vois pas l'intérêt d'utiliser NR autrement que pour discriminer la première ligne :

awk -F ',' 'NR!=1{for(i=2;i<=NF;i++)print $i}' donnee.csv >"$fichierConf"

ou j'ai raté un truc ?


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

Hors ligne

#4 Le 21/04/2022, à 13:49

DrussLaLegende

Re : [Résolu]-[AWK][BASH] saut de ligne à chaque boucle

@iznobe

Effectivement j'ai réussi a incrémenté NR à chaque boucle. J'ai en revanche du déclarer dans AWK la variable NbrRep comme ceci :

while [ "$NbrRep" -lt "$NbrLigne" ]
do
echo #"$(awk -F',' -v "NbrRep=$!NbrRep" 'NR==NbrRep+2 {print $2}' $FichierConf)"
let "NbrRep+=1"
done

@Watael

Watael a écrit :

je ne vois pas l'intérêt d'utiliser NR autrement que pour discriminer la première ligne :

En fait je me sers de NR pour sélectionner la "ligne" qui m’intéresse dans mon "tableau" de donnée dans la "colonne" $2.
Après peut-être que j'utilise mal NR et qu'il y a une autre solution pour récupérer la donnée d'une "cellule" dans un fichier .csv

Lorsque j'utilise ta commande :

awk -F ',' 'NR!=1{for(i=2;i<=NF;i++)print $i}' donnee.csv >"$fichierConf"

Cela me sors toutes les lignes à la suite en excluant la première ligne hors je veux seulement 1 paramètre à cet endroit et lors de la boucle d'après je veux le paramètre de la ligne du dessous.

Hors ligne

#5 Le 21/04/2022, à 16:27

Watael

Re : [Résolu]-[AWK][BASH] saut de ligne à chaque boucle

$ awk -F ',' 'BEGIN{printf "no ligne : "; getline nr < "-"}NR==nr{for(i=2;i<=NF;i++)print $i}' ficIn >ficOut

ça marche tout seul. smile


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

Hors ligne

#6 Le 25/04/2022, à 10:09

DrussLaLegende

Re : [Résolu]-[AWK][BASH] saut de ligne à chaque boucle

Super merci Watael ça marche impeccable !
Je clôture le sujet

Hors ligne