Bonjour à tous, un sujet pour apprendre et connaitre vos bonnes pratiques sur des “scripts en chaine”.
Je m’explique lorsque j’installe un nouveau YunoHost ou que je réinstalle mon serveur j’utilise un tableur avec la construction ci-dessous (par exemple).
Colonne A : yunohost domain cert-install
Colonne B : domaine.tld
(Et ceci multiplier par le nombre de domaine et sous domaine. J’ai des fichiers identiques avec l’ajout des domaines, les alias etc).
Et dans ma colonne C j’ai la formule A2&" "&B2 que j’étire sur mon nom de ligne pour obtenir la commande entière pour chacun des domaines dans l’exemple. Et ensuite je colle tout ça dans un txt et je rajoute && entre chaque ligne.
Ma question est donc comment vous procéder dans ces cas là ?
Autres cas ou j’aimerais connaitre vos méthodes sur des scripts localisés par exemple dans /usr/local/bin mais j’imagine que cela peut fonctionner pour toutes les rédactions.
Par exemple mon scripts de sauvegarde de mon Nextcloud est le suivant :
Mais quand je l’édite avec nano par exemple tout s’affiche sur une ligne ce qu’il fait que c’est peu facilement lisible et j’aurais aimé commenter chaque “morceau” afin de mieux le comprendre si je le rouvre dans 6 mois.
J’avais cru lire que si entre deux instructions, il n’y avait pas && alors les instructions s’enchainait quand même, même si la première échouait.
Voilà merci pour vos retours, conseils et méthodologie sur ce sujet.
Je vous souhaite de bonnes fêtes de fin d’année.
Prenez soin de vous.
Guillermo
PS : je voulais faire un seul sujet pour discuter de tout cela au même endroit mais si c’est peu lisible je peux scinder les deux discussions.
Par rapport à la construction avec && : à mon avis tu peux t’en passer car c’est effectivement pas lisible. Si tu met tout ça dans un script alors le plus simple est d’ajouter au tout début :
set -eu
ce qui active l’option e (= s’arrêter et sortir du script si la moindre commande échoue) et u (faire référence à une variable non défini est considéré comme une erreur - dans ton cas tu n’utilises pas de variable, mais ça mange pas de pain).
Donc faire
set -eu
cmd1
cmd2
cmd3
est relativement équivalent à faire
cmd1 && cmd2 && cmd3
Tu aussi peux procéder d’une autre façon qui consiste à mettre tes instructions sur plusieurs ligne en mettant un \ à la fin pour indiquer à bash que tu n’as pas fini et que ça continue sur la ligne suivante :
cmd1 \
&& cmd2 \
&& cmd3
(faut juste pas oublier de rajouter le \ à la fin, ce qui est vite arrivé …)
Autres remarques :
si tu veux aller + loin dans le script bash, tu pourrais probablement faire avec une boucle for ce que tu fais avec ton tableur :
Il me semble que donner le nom de domaine à la commande yunohost domain cert-install est optionnel et que si il n’est pas donné, il install un certif sur tous les domaines ? Donc peut-être que ça se résume à yunohost domain cert-install …
Tu peux ajouter set -eux en haut d’un script GNU Bash pour faire en sorte d’avoir une trace des commandes (x), que le script s’arrête a la premiere commande causant une erreur (e) ou a l’utilisation d’une variable non définie (u), ces trois options sont recommandées en général durant le developpement de scripts GNU Bash mais il est aussi possible de garder ces options durant l’usage normal du script. En particulier l’option e.
Par exemple avec le script précédent ça donne:
#!/bin/bash
set -eux
while read -r domain; do
yunohost domain cert-install "$domain"
done
Il est aussi utile pour intégrer les bonnes pratiques de vérifier ses scripts avec Shellcheck.
Disons que c’était la seule chose que je maitrisais jusqu’à maintenant. Mais ce matin j’ai du faire jouer 15 commandes pour 39 utilisateurs différents donc je me retrouve avec un tableau de 585 lignes ce qui fait beaucoup ^^ donc autant apprendre un peu plus et monter en compétence.
Merci je vais tester la commande set -eu sur mes prochains gros trucs. Et ce qu’on peux imaginer que cela s’écrire aussi comme cela.
set -eu
#Commande 1 pour faire celui.
cmd1
#Commande 2 pour faire ceci.
cmd2
#Commande 3 pour faire autre chose.
cmd3
Mais du coup la deuxième commande fait intervenir aussi le && ? Après mes lignes de ce matin je les ai collé dans Putty pour jouer les commandes. Je ne les inscrits pas forcément dans un fichier.
Oui j’ai pus m’en rendre compte souvent sur mon tableur d’avoir oublier un slash ou un espace quelque part et après sur le bloc note bonjour l’angoisse pour retrouver ce qu’il manque.
Autres remarques :
si tu veux aller + loin dans le script bash, tu pourrais probablement faire avec une boucle for ce que tu fais avec ton tableur :
DOMAINS="domaine1.tld domaine2.tld domaine3.tld"
for DOMAIN in $DOMAINS
do
yunohost domain cert-install $DOMAIN
done
Il me semble que donner le nom de domaine à la commande yunohost domain cert-install est optionnel et que si il n’est pas donné, il install un certif sur tous les domaines ? Donc peut-être que ça se résume à yunohost domain cert-install …
Merci beaucoup je vais essayer d’approfondir sur ce terrains là aussi pour les prochaines. J’essayerais la prochaine fois que j’aurais l’occasion pour les certificats.
Pour le fichier DOMAINS=domaine1.tld etc on peux imagine de mettre *.domaine.tld pour qu’il cherche lui même tout les sous domaine possible ?
En tout cas merci beaucoup d’avoir pris le temps de me donner toutes ces informations.
Merci beaucoup Léo pour ces ressources, je ne connaissais pas non plus shellcheck, je vais le mettre en favoris pour une utilisation prochaine.
Voilà de quoi m’occuper quelques temps avec ce manuel ^^
Je vais essayer aussi ces deux méthodes avec l’histoire de fichier, mais je pense que ce sera quand j’aurais pris un peu plus d’aise avec bash
Pour le fichier DOMAINS=domaine1.tld etc on peux imagine de mettre *.domaine.tld pour qu’il cherche lui même tout les sous domaine possible ?
Il faut lui instruire comment chercher tous les sous-domaines, utiliser l’étoile seulement ne suffit pas.
Premierement il n’y a aucun moyen d’énumérer tous les sous-domaines d’un domaine car la liste n’est disponible que dans la configuration DNS et n’est pas accessible publiquement. Il est seulement possible de vérifier si un certain sous-domaine existe mais pas de lister.
Par contre il est possible de demander a Yunohost de lister tous les domaines (et sous-domaines) enregistrés et ensuite de filtrer la sortie pour obtenir l’information recherchée, par exemple pour lister tous les sous-domaines de ynh.fr enregistrés dans Yunohost:
yunohost domain list | grep -Po "(?<= )\w{1}.+(ynh\.fr)$"
En combinant avec notre script de tout a l’heure:
yunohost domain list | grep -Po "(?<= )\w{1}.+(ynh\.fr)$" | ./script
Merci pour l’information alors honnêtement la partie en rouge sa ma perdu mais je garde sa sous le coude pour plus tard
mais sur le principe je comprends la restriction
Merci.
Une question annexe : vous gérer votre base de connaissance avec quoi comme logiciel ? Un wiki ?
Pour le moment je mets des choses sous Joplin et Notes de Nextcloud mais je pense que cela atteint ses limites. J’ai vu certaines personnes utiliser des Git aussi
Guillermo
Désolé, je voulais inclure une explication la dessus mais j’ai oublié. La partie en rouge est une expression régulière (regular expression, or regexp).
Il existe un site pour composer des expressions régulières intéractivement assez facilement: https://regex101.com/
Il est aussi possible de documenter des expressions régulières existantes via ce site, par exemple pour l’expression régulière de mon précédent message tu peux voir en haut a gauche ici: https://regex101.com/r/aCtk5P/1
Une question annexe : vous gérer votre base de connaissance avec quoi comme logiciel ? Un wiki ?
Pour le moment je mets des choses sous Joplin et Notes de Nextcloud mais je pense que cela atteint ses limites. J’ai vu certaines personnes utiliser des Git aussi
Un wiki c’est bien et simple a utiliser je pense, personnellement je ne maintiens pas de notes.
Merci beaucoup @lle-bout pour le détail des explications sa à l’air pratique si l’on maitrise le truc je vais tester tout cela.
Je pensais aussi au wiki, mais faut que j’arrive à trouver un format qui me convienne. Et si je note pas tout ce que les cerveaux d’ici me donnent comme informations, je risque d’oublier et de ne pas retrouver toute la leçon quand j’en aurais besoin donc je note