Script débutant

Bonjour à tous !

Je suis actuellement en formation donc je débute en scripting et sur Debian (oui je sais, ça fait beaucoup de début d’un coup :laughing: )
J’ai crée un petit script pas trop compliqué de création d’utilisateur :

[code]#!/bin/bash

echo "Donner le nom d’utilisateur :"
read user

echo "voici les services existants :"
echo | tail -10 /etc/group

echo "donner le service de l’utilisateur :"
read group

#Création du user et modification de son dossier personnel
useradd -m $user -g $group
passwd $user
chown $user /home/$user
chmod 770 /home/$user

#Création du compte Samba
smbpasswd -a $user

#Modification du fichier de configuration Samba
echo “” >> /etc/samba/smb.conf
echo [$user] >> /etc/samba/smb.conf
echo path=/home/$user >> /etc/samba/smb.conf
echo valid users=$user >> /etc/samba/smb.conf
echo browseable=yes >> /etc/samba/smb.conf
echo writeable=yes >> /etc/samba/smb.conf

/etc/init.d/samba restart

echo “création terminée”
[/code]

Je me doute que ma manière de modifier le fichier de conf de Samba n’est pas la plus propre ni la plus rapide, mais pour le moment ça marche… (Je reste ouvert si vous avez des conseils d’optimisation :stuck_out_tongue: )

J’ai crée également un second script pour, cette fois-ci, supprimer les users et leur dossier perso. (vraiment rien de sorcier…)

Ma seule question est comment faire pour que ce second script modifie le fichier smb.conf de manière à supprimer le dossier de l’utilisateur (je sais pas si c’est très clair… :confused: )
J’ai souvent vu revenir la commande “sed” mais je n’ai pas trop compris comment elle fonctionnait et ce qu’elle faisait…

Merci d’avance pour votre aide !

Tu peux remplacer :

#Modification du fichier de configuration Samba echo "" >> /etc/samba/smb.conf echo [$user] >> /etc/samba/smb.conf echo path=/home/$user >> /etc/samba/smb.conf echo valid users=$user >> /etc/samba/smb.conf echo browseable=yes >> /etc/samba/smb.conf echo writeable=yes >> /etc/samba/smb.conf
par

[code]#Modification du fichier de configuration Samba
cat >> fichier <<EOF

[$user]
path=/home/$user
valid users=$user
browseable=yes
writeable=yes
EOF[/code]

Ensuite pour supprimer l’utilisateur, le plus simple (tout en fiable) est probablement d’utiliser awk.

et tu peut t’en servir comme ça :

Perso je contournerais complètement le problème, de la manière suivante :

  • un fichier contenant la config de base (hors utilisateurs), par exemple [mono]/etc/samba/modeles/smb.conf[/mono]
  • un dossier contenant un fichier par utilisateur ([mono]nomdel’utilisateur.conf[/mono]), par exemple [mono]/etc/samba/modeles/users/maskime31.conf[/mono], [mono]/etc/samba/modeles/users/syam.conf[/mono] etc
  • pour ajouter, modifier ou supprimer un utilisateur il suffit de manipuler le fichier correspondant
  • ensuite il n’y a plus qu’à assembler tous les fichiers ensemble pour regénérer le “vrai” [mono]smb.conf[/mono] : [mono]cat /etc/samba/modeles/smb.conf /etc/samba/modeles/users/*.conf > /etc/samba/smb.conf[/mono]

Ça permet d’émuler le fonctionnement des répertoires [mono].d[/mono] que Samba ne supporte apparemment pas, et de rendre la procédure beaucoup moins fragile qu’une manipulation directe du [mono]smb.conf[/mono] (notamment par rapport aux pertes de données si quelque chose déconne pendant la modif du fichier).
Accessoirement ça simplifie aussi énormément la gestion des cas exceptionnels qui sortent du modèle normal, surtout pour leur modification/suppression (la création reste simple dans tous les cas).

:twocents-02cents:

Excellente idée :slightly_smiling:

Il est même possible d’utiliser mon « moteur de template » : bitbucket.org/barmic/bash-templet/src

Merci pour vos réponses rapides !! :023

@MisterFreez
Etant débutant, j’ai pas tout tout compris ce que fait ton code :

rm -rf "$(awk -F= -v user="toto" '"["user"]"==$0{gooduser=1}$1=="path"&&gooduser==1{print $2;exit}gooduser==1&&/\[.*\]/{exit}' /etc/samba/smb.conf)"

Mais je vais chercher et tester. :slightly_smiling:

@Syam

Si je comprends bien, toi tu crées un fichier de conf global de samba qui après est fusionner avec le fichier de conf par user. Je comprends, c’est une bonne idée, logique.
Par contre, à chaque fois que je vais exécuter ce script, ça va détruire smb.conf et le recréer après ou ça va juste le modifié ? (simple curiosité, ça risque pas de faire beaucoup d’opérations s’il y a beaucoup d’utilisateurs ?)

[quote=“maskime31”]Si je comprends bien, toi tu crées un fichier de conf global de samba qui après est fusionner avec le fichier de conf par user. Je comprends, c’est une bonne idée, logique.
Par contre, à chaque fois que je vais exécuter ce script, ça va détruire smb.conf et le recréer après ou ça va juste le modifié ? (simple curiosité, ça risque pas de faire beaucoup d’opérations s’il y a beaucoup d’utilisateurs ?)[/quote]
C’est bien l’idée : à chaque modification des fichiers on recrée complètement le [mono]smb.conf[/mono].

Au niveau performance, évidemment c’est beaucoup plus lent qu’une modification directe et ça va poser problème avec beaucoup d’utilisateurs. Reste à définir “beaucoup”…
Sur mon PC personnel (qui est très loin d’être un serveur) ça met environ 4.5 secondes à concaténer 10,000 fichiers (2.2s sur SSD au lieu du disque dur), après avoir soigneusement vidé les buffers pour éviter que les fichiers ne soient cachés en mémoire. Même sur un réseau avec 1000 utilisateurs (c’est quand même pas mal…) ça va mettre moins d’une demi-seconde pour regénérer le fichier.
Ça laisse de la marge non ? :stuck_out_tongue:
D’autant que tu vas sûrement avoir d’autres problèmes bien plus importants (au hasard : charge sur le serveur Samba, bande passante pour accéder aux partages, …) bien avant que la regénération du [mono]smb.conf[/mono] commence à poser des problèmes de performances. :wink:

Ouais ok. Je pense bien que c’est pas ça qui aurait posé problème, c’était plus pour être sûr d’avoir bien compris comment ça marchait. :wink:

Merci beaucoup en tout cas !

Cela dit c’était une excellente remarque, ça prouve que tu es attentif à ce genre de problématique (c’est pas tout le monde, hein, loin de là…).
Mais effectivement quand il est question de performances, faut toujours se demander où sont les goulots d’étranglement et si le problème actuel a une quelconque influence dessus. Une fois que tu as déterminé ça, tu sais si la performance est un aspect important ou si tu peux te permettre d’en sacrifier un peu (raisonnablement) pour te rendre la vie plus simple. :wink:
Dans le même ordre d’idées, ça vaut largement plus le coup de passer 2 semaines à optimiser un goulot d’étranglement plutôt que de passer 1 heure à optimiser un truc qui n’a strictement aucune influence en pratique. :wink:

Et du coup, elle fait quoi et marche comment la commande awk ?

Analyse bloque par bloque (par défaut ligne par ligne) un fichier ou son entrée standard.
Pour chaque bloque, il permet d’analyser le bloc en cours en découpant celui-ci (par défaut sur les caractères d’espacement, ici avec -F j’ai choisi de découper sur =) et il place chaque bout dans une variable $n. $0 est le bloque complet (ici la ligne), $1 le premier champ, $2 le second, etc.
On peut créer des variable depuis la ligne de commande avec [mono]-v nomVariable=valeurVariable[/mono].
La syntaxe est :

condition { code } condition { code }

pour :

On peut voir le code ainsi :

"["user"]"==$0 { # si la ligne ($0) est de la forme "[user]" (avec user remplacé par la valeur remplacée par "toto" ici) gooduser=1 # on défini une nouvelle variable qui sera égale à 1 (elle permet de savoir que les lignes en cours sont celle du bon utilisateur } $1=="path" && gooduser==1 { # si le premier champ (quand on prend la ligne est qu'on la découpe sur "=" est path et que l'on est sur une ligne de l'utilisateur print $2; # on affiche le second champ (le chemin) exit # on arrête le programme pas là peine d'aller plus loin } gooduser==1 && /\[.*\]/ { # si on a déjà rencontré le bon utilisateur (puisque gooduser est à 1), mais qu'on passe à un autre utilisateur la ligne vaut [.*] (le $0 est implicite) exit # on quitte le programme c'est que l'utilisateur n'avait pas de path }

Ok, je comprend à peut près comment ça marche.

Par contre je comprends pas comment elle peut supprimer ces lignes là… :017

J’avais mal lue ta demande.
Tu peut avec awk recopier ton fichier sauf les lignes qui sont celles de ton utilisateur à supprimer.

awk -F= -v user="toto" 'BEGIN{gooduser=0}"["user"]"==$0{gooduser=1}gooduser==1&&/\[.*\]/{gooduser=0}gooduser==0' /etc/samba/smb.conf > /etc/samba/smb.conf.new mv /etc/samba/smb.conf.new /etc/samba/smb.conf
Si on ommet le bloque de code ça équivaut au bloc [mono]{ print }[/mono] qui équivaut à [mono]{ print $0 }[/mono].

Mais clairement la solution de syam est à des années lumières. Elle a toutes les qualités et pas de défaut. Les questions de performances dont tu parle sont inexistant. Si tu en arrivais vraiment là, il faudrait plutôt tenter de pluger samba sur un annuaire LDAP.

D’acc ! la je capte tout !

Oui oui la solution de Syam est vraiment très bonne. Je voulais juste comprendre awk, je pense que j’en aurais besoin à l’avenir. :smiley:

Je pense aussi que les “pertes” en performances seront microscopiques.

Merci pour votre patience et votre aide !

Dans un cadre “scolaire” y’a quand même un petit danger avec ce type de solutions qui contournent complètement le problème initial sans le résoudre : beaucoup d’exercices ont des buts non avoués (ici, apprendre à supprimer des lignes particulières dans un fichier me paraît être un but raisonnable de l’exercice “ajouter/supprimer des partages dans le smb.conf”) et les profs/formateurs peuvent parfois attendre des solutions bien précises.
Enfin si ça n’est pas spécifié dans l’énoncé alors tout est permis, faut juste se préparer à argumenter un peu si le prof/formateur fait mine de se rebeller. :mrgreen:

Sinon, rien à voir mais si ton problème est résolu => coche verte à droite pour l’indiquer. :slightly_smiling:

L’exercice nous demandais simplement de scripter la création d’un user de ses dossiers et les droits. Le samba et le second script était uniquement là pour combler ma curiosité personnelle. :wink:

Je marque de suite en résolu.