J'ai besoin de créer un fichier de configuration pour mon propre script: voici un exemple:
scénario:
#!/bin/bash
source /home/myuser/test/config
echo "Name=$nam" >&2
echo "Surname=$sur" >&2
Contenu de /home/myuser/test/config
:
nam="Mark"
sur="Brown"
ça marche!
Ma question: est-ce la bonne façon de procéder ou y a-t-il d'autres façons?
bash
shell
shell-script
Pol Hallen
la source
la source
abcde
le fait également de cette façon et c'est un assez gros programme (pour un script shell). Vous pouvez y jeter un œil ici .Réponses:
source
n'est pas sécurisé car il exécutera du code arbitraire. Cela peut ne pas vous préoccuper, mais si les autorisations de fichier sont incorrectes, il peut être possible pour un attaquant disposant d'un accès au système de fichiers d'exécuter du code en tant qu'utilisateur privilégié en injectant du code dans un fichier de configuration chargé par un script sécurisé tel qu'un script d'initialisation.Jusqu'à présent, la meilleure solution que j'ai pu identifier est la solution maladroite de réinvention du volant:
myscript.conf
À l'aide
source
, cela s'exécuteraitecho rm -rf /
deux fois, ainsi que changer l'utilisateur en cours d'exécution$PROMPT_COMMAND
. Au lieu de cela, faites ceci:myscript.sh (Bash 4)
myscript.sh ( compatible Mac / Bash 3)
Veuillez répondre si vous trouvez un exploit de sécurité dans mon code.
la source
*
correctement les entrées, mais qu'est-ce qui, dans Bash, gère bien ce personnage?my\\password
Voici une version propre et portable compatible avec Bash 3 et plus, sur Mac et Linux.
Il spécifie toutes les valeurs par défaut dans un fichier séparé, pour éviter la nécessité d'une fonction de configuration "par défaut" énorme, encombrée et dupliquée dans tous vos scripts shell. Et il vous permet de choisir entre la lecture avec ou sans repli par défaut:
config.cfg :
config.cfg.defaults :
config.shlib (c'est une bibliothèque, donc il n'y a pas de ligne de shebang):
test.sh (ou tout script où vous souhaitez lire les valeurs de configuration) :
Explication du script de test:
printf
ligne? Eh bien, c'est quelque chose que vous devez savoir:echo
c'est une mauvaise commande pour imprimer du texte que vous n'avez aucun contrôle. Même si vous utilisez des guillemets doubles, il interprètera les drapeaux. Essayez de mettremyvar
(inconfig.cfg
) sur-e
et vous verrez une ligne vide, car vousecho
penserez que c'est un drapeau. Maisprintf
n'a pas ce problème. Leprintf --
dit "imprimer ceci, et n'interprète rien comme des drapeaux", et le"%s\n"
dit "formater la sortie sous forme de chaîne avec un retour à la ligne de fin, et enfin le paramètre final est la valeur pour printf à formater.myvar="$(config_get myvar)";
. Si vous allez les imprimer à l'écran, je suggère d'utiliser printf pour être totalement à l'abri de toute chaîne incompatible avec l'écho qui pourrait se trouver dans la configuration utilisateur. Mais l'écho est très bien si la variable fournie par l'utilisateur n'est pas le premier caractère de la chaîne que vous faites écho, car c'est la seule situation où "drapeaux" pourrait être interprété, donc quelque chose commeecho "foo: $(config_get myvar)";
est sûr, car le "foo" ne le fait pas commencez par un tiret et indique donc à echo que le reste de la chaîne n'est pas non plus un indicateur. :-)la source
config.cfg.defaults
au lieu de les définir au moment de l'appel$(config_get var_name "default_value")
. tritarget.org/static/…Analysez le fichier de configuration, ne l'exécutez pas.
J'écris actuellement une application au travail qui utilise une configuration XML extrêmement simple:
Dans le script shell ("l'application"), voici ce que je fais pour obtenir le nom d'utilisateur (plus ou moins, je l'ai mis dans une fonction shell):
La
xml
commande est XMLStarlet , qui est disponible pour la plupart des Unices.J'utilise XML car d'autres parties de l'application traitent également des données encodées dans des fichiers XML, donc c'était plus simple.
Si vous préférez JSON, il
jq
existe un analyseur JSON shell facile à utiliser.Mon fichier de configuration ressemblerait à ceci en JSON:
Et puis j'obtiendrais le nom d'utilisateur dans le script:
la source
eval
pour définir plusieurs valeurs, vous exécutez des parties sélectionnées du fichier de configuration :-).eval
quoi que ce soit. Les performances de l'utilisation d'un format standard avec un analyseur existant (même s'il s'agit d'un utilitaire externe) sont négligeables par rapport à la robustesse, la quantité de code, la facilité d'utilisation et la maintenabilité.La manière la plus courante, efficace et correcte consiste à utiliser
source
, ou.
sous forme de raccourci. Par exemple:ou
Cependant, il faut tenir compte des problèmes de sécurité que l'utilisation d'un fichier de configuration externe supplémentaire peut soulever, étant donné que du code supplémentaire peut être inséré. Pour plus d'informations, notamment sur la façon de détecter et de résoudre ce problème, je vous recommande de consulter la section «Secure it» de http://wiki.bash-hackers.org/howto/conffile#secure_it
la source
J'utilise ceci dans mes scripts:
Devrait prendre en charge toutes les combinaisons de caractères, sauf que les clés ne peuvent pas en avoir
=
, car c'est le séparateur. Tout le reste fonctionne.De plus, c'est complètement sûr car il n'utilise aucun type de
source
/eval
la source
Pour mon scénario,
source
ou.
était bien, mais je voulais prendre en charge les variables d'environnement locales (c'est-à-direFOO=bar myscript.sh
) en prévalant sur les variables configurées. Je voulais également que le fichier de configuration soit modifiable par l'utilisateur et confortable pour quelqu'un habitué aux fichiers de configuration, et qu'il soit aussi petit / simple que possible, afin de ne pas distraire de l'objectif principal de mon tout petit script.Voici ce que j'ai trouvé:
Essentiellement - il vérifie les définitions des variables (sans être très flexible sur les espaces blancs) et réécrit ces lignes afin que la valeur soit convertie en valeur par défaut pour cette variable, et que la variable ne soit pas modifiée si elle est trouvée, comme la
XDG_CONFIG_HOME
variable ci-dessus. Il source cette version modifiée du fichier de configuration et continue.Les travaux futurs pourraient rendre le
sed
script plus robuste, filtrer les lignes qui semblent étranges ou qui ne sont pas des définitions, etc., ne pas casser les commentaires de fin de ligne - mais cela me suffit pour le moment.la source
C'est succinct et sûr:
Le
-i
garantit que vous obtenez uniquement les variables decommon.vars
la source
Tu peux le faire:
la source