#1 Le 05/07/2021, à 11:25
- omorin
Un petit script pour définir des variables à partir d'un fichier
Bonjour,
J'ai écris un script de sauvegarde sur LTO, et j'ai voulu créer une sorte de catalogue des K7 utilisées.
Sur chaque LTO, je 'cat' un fichier 'label' qui contient des variables du style volume='Nom de la K7', date='date de mise en oeuvre de la K7', etc.
ce fichier est lu à avant caque sauvegarde et les 'tar' sont ajouté à la suite.
Je voulais utiliser ce fichier pour renseigner des variables dans mon script de sauvegarde mais un 'source' me semblait risqué, surtout qu'il est lancé en 'sudo'.
Si on met une commande dans le fichier de 'label' une commande elle sera exécutée !
J'ai donc travaillé sur la déclarations de variables avec la commande 'declare' et me suis confronté à de petites difficultés...
Vous remarquerez que le 'ls' n'est pas exécuté.
La solution pouvant servir à tous pur d'autres scripts. , la voici.
#!/bin/bash
liste=$(sed '/^#/d' fic.txt | sed '/^$/d')
while IFS='=' read nom valeur
do
let ligne++
echo "On a trouvé : $nom=$valeur"
declare $nom="$(echo $valeur | xargs )"
echo "On a déclaré : $nom=\"${!nom}\""
done < <(echo "$liste")
echo "$ligne traitée(s)"
le fichier :
# Commentaire
w=$(ls -lh)
x='123'
Y='ABC DEF'
z=0
le résultat
On a trouvé : w=$(ls -lh)
On a déclaré : w="$(ls -lh)"
On a trouvé : x='123'
On a déclaré : x="123"
On a trouvé : Y='ABC DEF'
On a déclaré : Y="ABC DEF"
On a trouvé : z=0
On a déclaré : z="0"
4 traitée(s)
Hors ligne
#2 Le 05/07/2021, à 11:58
- Watael
Re : Un petit script pour définir des variables à partir d'un fichier
salut,
Vous remarquerez que le 'ls' n'est pas exécuté.
et c'est très bien, parce que utiliser ls dans un script est rarement une bonne idée, et encore plus quand il est question de parcourir sa sortie pour en extraire des noms de fichiers.
toi, tu veux que les commandes contenues dans ton fichier de configuration 'label' soient exécutées, c'est ça ?
d'abord, est-ce que ces commandes apparaissent dans tous les fichiers 'label' ? alors, elles ne devraient pas figurer dans chaque fichier 'label', mais, une seule fois, dans le script (ce qui est commun doit être dans le "tronc commun").
àmha, un fichier de conf ne doit pas exécuter de commandes, sinon c'est un script.
si tu craint d'utiliser source de peur d'exécuter des commandes introduites dans tes fichiers de conf, la solution qu'on peut te proposer n'atténuera pas cette crainte.
oui, si tu veux faire exécuter des commandes de tes fichiers 'label', elles seront exécutées quelles qu'elles soient.
en résumé, source tes fichiers*, ou pas de commandes dans tes fichiers de conf.
--
* mais ce n'est, selon moi, pas indispensable : tu peux définir les mêmes variables dans autant de fichiers CSV que de "label", ou un grand CSV qui reprendra tous les "label".
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 05/07/2021, à 12:39
- cqfd93
Re : Un petit script pour définir des variables à partir d'un fichier
Bonjour,
Dans ta signature :
Perso : Ubuntu 11.10 sur DELL 1501 en dual boot avec Vista
Travail : tout plein de postes sous Ubuntu et des serveurs sous 8.04 et 10.04
Tu es vraiment toujours sur ces versions hyper obsolètes ?
− cqfd93 −
Hors ligne
#4 Le 05/07/2021, à 12:55
- Hizoka
Re : Un petit script pour définir des variables à partir d'un fichier
Bonjour,
je viens justement de faire un point là dessus pour un programme
En effet source est dangereux car tu peux te retrouver à exécuter du code non voulu.
Il faut donc lire le fichier sans rien exécuter sinon, ça n'a aucun intérêt.
Avec un fichier :
[Global]
var1=value1
var2=value2
var3=value3
[Effects]
var1=value1
var2=value2
var3=value3
et la commande :
shopt -s extglob
while read CfgLine
do
# Suppression des espaces
CfgLine="${CfgLine/#*([[:space:]])/}"
if [[ ${CfgLine} =~ ^"["(.+)"]"$ ]]
then
GroupName=${BASH_REMATCH[1]}
declare -A ${GroupName}
elif [[ ${CfgLine} =~ ^([_a-Z][_a-Z0-9]*)"="(.*) ]]
then
case "${BASH_REMATCH[2]:0:1}" in
'"') Separator='"' ;;
"'") Separator="'" ;;
" ") Separator="" ;;
*) Separator=" " ;;
esac
# Suppression du 1er séparateur
Value="${BASH_REMATCH[2]/#${Separator}}"
# Remplace le caractère séparateur s'il est échappé
Value="${Value//\\${Separator}/@@@@Hizo@@@@}"
# Supprime tout à partir du séparateur, ainsi, on ne reprend pas les commentaires
Value="${Value%%${Separator}*}"
# Remet en place les caractères échappés
Value="${Value//@@@@Hizo@@@@/${Separator}}"
declare ${GroupName}[${BASH_REMATCH[1]}]="${Value}"
fi
done < "FICHIER de config"
te donne des tableaux indexés avec leurs valeurs.
for var in "${!Global[@]}"
do
echo "$var : ${Global[$var]}"
done
#var1 : value1
#var2 : value2
#var3 : value3
for var in "${!Effects[@]}"
do
echo "$var : ${Effects[$var]}"
done
#var1 : value1
#var2 : value2
#var3 : value3
Aucune commande n'est exécutée qu'elle soit dans le fichier ou dans une variable.
Après si tu veux juste charger des variables :
shopt -s extglob
while read CfgLine
do
# Suppression des espaces
CfgLine="${CfgLine/#*([[:space:]])/}"
if [[ ${CfgLine} =~ ^([_a-Z][_a-Z0-9]*)"="(.*) ]]
then
case "${BASH_REMATCH[2]:0:1}" in
'"') Separator='"' ;;
"'") Separator="'" ;;
" ") Separator="" ;;
*) Separator=" " ;;
esac
# Suppression du 1er séparateur
Value="${BASH_REMATCH[2]/#${Separator}}"
# Remplace le caractère séparateur s'il est échappé
Value="${Value//\\${Separator}/@@@@Hizo@@@@}"
# Supprime tout à partir du séparateur, ainsi, on ne reprend pas les commentaires
Value="${Value%%${Separator}*}"
# Remet en place les caractères échappés
Value="${Value//@@@@Hizo@@@@/${Separator}}"
declare ${BASH_REMATCH[1]}="${Value}"
fi
done < "FICHIER de config"
Tu peux remplacer certaines commandes bash par un sed lors du chargement du fichier.
EDIT : Modification du code pour qu'il accepte les commentaires.
Dernière modification par Hizoka (Le 09/07/2021, à 13:22)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#5 Le 05/07/2021, à 13:18
- bruno
Re : Un petit script pour définir des variables à partir d'un fichier
En effet source est dangereux car tu peux te retrouver à exécuter du code non voulu.
Je ne vois pas en quoi c'est dangereux. Qu'un programme en bash soit dans un seul fichier ou plusieurs cela change quoi ?
Qui plus est, c'est une pratique extrêmement courante et présente à de nombreux endroits sur un système standard.
#6 Le 05/07/2021, à 13:29
- MicP
Re : Un petit script pour définir des variables à partir d'un fichier
… c'est une pratique extrêmement courante …
+1
Il y a, par exemple, les fichiers :
~/.bashrc
~/.profile
~/.bash_logout
Hors ligne
#7 Le 05/07/2021, à 15:18
- Hizoka
Re : Un petit script pour définir des variables à partir d'un fichier
Heu...
ton soft inclut un fichier de config dont il attend UNIQUEMENT des variables et il se retrouve à exécuter du code...
Y a pas un problème là ?
Il suffit que le fichier de config se retrouve avec des droits trop élargis et ça peut vite mal tourner...
Un soft peut être en plusieurs parties pour simplifier sa maintenance mais ce n'est absolument pas la même chose que le chargement d'un fichier de config.
Exemple :
- Un soft dans /usr/share/
- Il charge un fichier de config dans ~/.config
Si tu ne protèges pas, ton script peut se retrouver à exécuter des commandes non attendues.
Pour peu que le soft demande les droits root...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 05/07/2021, à 15:34
- Watael
Re : Un petit script pour définir des variables à partir d'un fichier
Y a pas un problème là ?
il faut savoir ce qu'on veut :
soit, définir des variables, ici, sourcer n'est pas, dans le cadre d'un script, pertinent. on peut : « Y'en a qu'ont essayé, ils ont eu des problèmes ! »
soit, exécuter des commandes, là on source ! et c'est aussi dangereux que d'exécuter un script.
Dernière modification par Watael (Le 05/07/2021, à 15:35)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 05/07/2021, à 15:44
- bruno
Re : Un petit script pour définir des variables à partir d'un fichier
Bon il faut arrêter avec les « commandes inattendues » et le code « non voulu ». Le fichier sourcé (avec que des variables ou du code, ce n'est pas la question) ne peut être modifié que par son propriétaire, sauf grossière erreur de gestion des permissions. Si on y introduit de code cela n'a rien d’inattendu ni de fortuit. C'est par une opération volontaire de l'utilisateur.
Donc je ne vois aucun problème de sécurité à sourcer un fichier en bash et encore un fois c'est très fréquent. Une bonne partie des fichiers de configuration sous /etc sont sourcés par des scripts.
#10 Le 05/07/2021, à 15:55
- Watael
Re : Un petit script pour définir des variables à partir d'un fichier
j'invite note camarade omorin à quand même bien réfléchir à ce qui entre dans ses fichiers de conf, afin qu'il n'y ait pas de doublons, alors que des informations répétées dans tous ces fichiers pourraient n'apparaître qu'une seule fois dans le corps du script.
Dernière modification par Watael (Le 05/07/2021, à 15:55)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 05/07/2021, à 16:01
- Hizoka
Re : Un petit script pour définir des variables à partir d'un fichier
Watael => je suis OK avec toi.
Ma solution ne concerne que le chargement de variable.
S'il veut exécuter des commandes, en effet il passe par un source.
mais bon, sourcer un fichier quand tu es en sudo, il vaut mieux être sûr du fichier...
bruno =>
je présume que tu ne laisses absolument personne accéder à ton pc quand tu es loggué dessus.
De même, je pense que tu vérifies bien TOUT ce qui s'installe sur ton pc.
Car en installant un paquet non vérifié par exemple ou via un script d'installation, on pourrait très bien modifier des fichiers de config qui t'appartiennent.
Donc plus de souci vraiment avec les droits.
Mais ce n'est surement pas le cas de tout le monde, on peut alors critiquer l’hyène informatique mais bon, autant prévenir que guérir (surtout en cette période ).
Sans parler des gens qui balancent un chmod -R 777 pour une raison quelconque dans leur home ou dossier de config car indiqué sur un site.
Alors oui, les risques sont limités mais ce n'est pas une raison pour ne pas les prendre en compte surtout quand le temps de traitement n’alourdit pas spécialement le tout...
Il faut protéger au max un logiciel contre ses utilisateurs qui feront des choses inattendues dessus...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 05/07/2021, à 16:11
- bruno
Re : Un petit script pour définir des variables à partir d'un fichier
Il faut protéger au max un logiciel contre ses utilisateurs qui feront des choses inattendues dessus...
C'est bien sur ce point que ne ne pourrons jamais être d'accord
En matière de sécurité il est absolument illusoire, vain, irréaliste,… de vouloir protéger l'utilisateur contre lui-même.
D'ailleurs on ne peut pas protéger de choses inattendues puisqu'elles sont par essence imprévisibles. C'est comme prétendre que l'on peut prévoir l'avenir
Dernière modification par bruno (Le 05/07/2021, à 16:39)
#13 Le 05/07/2021, à 16:20
- Watael
Re : Un petit script pour définir des variables à partir d'un fichier
on ne peut pas l'empêcher de s'envoyer dans le mur, mais on peut lui dire d'attacher sa ceinture, et de ne pas débrancher les airbags.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 05/07/2021, à 16:22
- Hizoka
Re : Un petit script pour définir des variables à partir d'un fichier
L'utilisateur est capable de grandes innovations
mais ce n'est pas une raison pour ne pas limiter les risques.
On pourrait faire un parallèle (même si on joue pas dans la même court niveau dangerosité) avec la sécurité routière : à quoi bon lutter, les gens conduisent comme des c**s...
EDIT : Merci Watael, c'est mieux dit
Dernière modification par Hizoka (Le 05/07/2021, à 16:22)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne