IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Exercice Perso en Shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Par défaut Exercice Perso en Shell
    Bonjour/bonsoir à tous et toutes,

    je viens vers vous car j'ai un petit exo perso à faire, qui consiste à cela :

    J'ai un fichier csv qui est composé de :
    Identifiant,Nom,Prenom,Service,Fonction,Permanent,
    info1,Napo,Léon,info,Directeur,Oui,
    info2,Scripte,Perle,info,Responsable,Oui,
    info3,Scrout,Jessica,info,Employe,Oui,
    info4,Martin,Henri,info,Employe,Non,
    compta1,Terrieur,Alex,compta,Directeur,Oui,
    compta2,Eràk,Patrique,compta,Responsable,Oui,
    compta3,Personne,Jonathan,compta,Employe,Non,
    compta4,Demùsset,Alfred,Compta,Employe,Non,
    boss,MANVUSSA,Gérard,direction,Directeur,Oui,
    info5,Terrieur,Alain,info,Employe,Non,
    info4,Martin,Henri,info,Employe,Non,
    comm1,MANVUSSA,Gérard,commercial,Directeur,Oui,
    comm2,Despoireaux,Yvan,commercial,Employe,Oui,
    comm3,Trëchere,Yvan,commercial,Employe,Non,

    et je dois faire cela :

    Pour chaque service, créer un répertoire commun à l’ensemble des personnes du service.
    Dans le répertoire du service créer pour chaque utilisateur du service un répertoire personnel.
    Créer les utilisateurs en respectant les obligations suivantes :
    Pour les CDI (permanent) affecter un mot de passe et un login en mode shadow.
    Pour les CDD définir un compte provisoire pour 60 jours.


    du coup pour l'instant j'ai écris cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #!/bin/sh
    date_expire=`date -d "60 days" +%Y-%m-%d`
    while IFS=',' read Identifiant Nom Prenom Service Fonction Permanent
    do line="$Identifiant $Nom $Prenom $Service $Fonction $Permanent"
     
            if grep -q "$Service" "/etc/group" ;then
                    echo "$Service Trouvé"
            else
                    echo "creation du Groupe $Service"
                    groupadd $Service;
            fi
     
            if [ ! -d "/home/$Service" ];then
                    echo "Création du répertoire $Service";
                    mkdir /home/$Service
                    chown -R root:$Service /home/$Service
            fi
     
            if [ ! -d "/home/$Service/$Prenom$Nom" ];then
                    echo "Création Répertoire $Prenom$Nom";
                    mkdir /home/$Service/$Prenom$Nom
                    chown -R root:$Service /home/$Service/$Prenom$Nom
            fi
     
                    ##generation du password en curl ##
                    #pwd=`curl --silent http://www.sethcardoza.com/api/rest/tools/random_password_generator`
            #echo "$Permanent"
            if [ $Permanent = "oui" ];then
                    #echo "$Permanent"
                    pwd=`curl --silent http://www.sethcardoza.com/api/rest/tools/random_password_generator`
                    useradd "$Identifiant" -p "$pwd" -d "/home/$Service/$Prenom$Nom" -e "" -g "$Service"
                    chown -R "$Identifiant":"$Service" "/home/$Service/$Prenom$Nom"
                    else
                            useradd "$Identifiant" -p "$pwd" -d "/home/$Service/$Prenom$Nom" -e "$date_expire" -g "$Service"
                            chown -R "$Identifiant":"$Service" "/home/$Service/$Prenom$Nom"
            fi
     
     
     
    done < /home/toto/fichier-edit.csv
    J'arrive bien à créer les différents répertoires pour les services :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    drwxr-xr-x 24 root       root       4096 déc.  14 11:26 ..
    drwxr-xr-x  5 root       commercial 4096 déc.  15 08:43 commercial
    drwxr-xr-x  5 root       compta     4096 déc.  15 08:42 compta
    drwxr-xr-x  3 root       Compta     4096 déc.  15 08:42 Compta
    drwxr-xr-x  3 root       direction  4096 déc.  15 08:43 direction
    drwxr-xr-x  7 root       info       4096 déc.  15 08:43 info
    drwxr-xr-x  3 root       Service    4096 déc.  15 08:42 Service
    ainsi que les répertoires de chaques utilisateurs dans le service correspondant (exemple ici pour le service "compta"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    drwxr-xr-x 2 compta1 compta 4096 déc.  15 08:42 AlexTerrieur
    drwxr-xr-x 2 compta3 compta 4096 déc.  15 08:42 JonathanPersonne
    drwxr-xr-x 2 compta2 compta 4096 déc.  15 08:42 PatriqueEr?k
    On constate que l'identifiant lié à l'utilisateur passe bien en paramètre lors du chown
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    own -R "$Identifiant":"$Service" "/home/$Service/$Prenom$Nom"
    Bref mon problème se trouve dans cette partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if [ $Permanent = "oui" ];then
                    #echo "$Permanent"
                    pwd=`curl --silent http://www.sethcardoza.com/api/rest/tools/random_password_generator`
                    useradd "$Identifiant" -p "$pwd" -d "/home/$Service/$Prenom$Nom" -e "" -g "$Service"
                    chown -R "$Identifiant":"$Service" "/home/$Service/$Prenom$Nom"
                    else
                            useradd "$Identifiant" -p "$pwd" -d "/home/$Service/$Prenom$Nom" -e "$date_expire" -g "$Service"
                            chown -R "$Identifiant":"$Service" "/home/$Service/$Prenom$Nom"
            fi
    J'ai l’impression que dans ma boucle if il n'arrive pas à check ma variable $Permanent = "oui" et passe direct au else.
    Pourtant quand je fais un echo de ma variable $Permanent au dessus de ma boucle if je constate bien que celle si contient soit oui ou non .. donc je comprends pas pourquoi il me l'a saute lors de la vérification..
    Je vois pas mon erreur donc si vous pouviez m'aider .. cela pourrait être sympa

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,

    Ton problème est lié à la casse: tu check si c'est "oui" alors que dans ton fichier csv c'est "Oui"

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Par défaut
    je m'en suis rendu compte quand j'ai posté en effet, mais en faite ma variable récupére soit "Oui," soit "Non,"

    J'ai du coup testé en modifiant " .. = "Oui," mais rien n'y fait ..

    j'ai mis un echo comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if [ $Permanent = "Oui," ];then
                    echo "On est dans le THEN"
                    pwd=`curl --silent http://www.sethcardoza.com/api/rest/tools/random_password_generator`
                    #echo "ID:$Identifiant-PWD:$pwd-Prénom:$Prenom-Nom:$Nom" >> data-connexion.txt
                    useradd "$Identifiant" -p "$pwd" -d "/home/$Service/$Prenom$Nom" -e "" -g "$Service"
                    chown -R "$Identifiant":"$Service" "/home/$Service/$Prenom$Nom"
                    else
                    echo "On est dans le ELSE"
                            pwd=`curl --silent http://www.sethcardoza.com/api/rest/tools/random_password_generator`
                            useradd "$Identifiant" -p "$pwd" -d "/home/$Service/$Prenom$Nom" -e "$date_expire" -g "$Service"
                            chown -R "$Identifiant":"$Service" "/home/$Service/$Prenom$Nom"
            fi
    et comme je le pensais .. il passe direct au niveau du else, comme si il n'arrivait pas à effectuer le check ou qu'il ne fait pas le check correctement ...

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Ok, comme le "Oui," ou "Non," sont les dernier champs, tu dois avoir un fichier au format dos, donc le "Oui," est en fait "Oui,^M"
    qui est un control M ou "\r"

    Tu peux le verifier via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat -A /home/toto/fichier-edit.csv
    Si c'est le cas, essaye de modifier la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    done < /home/toto/fichier-edit.csv
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    done < <(sed -e 's/\r//' /home/toto/fichier-edit.csv)
    Enfin, si ton shell supporte cette écriture (bien respecter l'espace entre les 2 "<")

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Par défaut
    Ok je vais essayé ça et je te fais un retour

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour,

    un test de ce type est aussi possible (dans ton cas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ ${Permanent,,} =~ ^oui ]]; then
    a faire aussi sur "service" (forcer minuscule) car j'ai remarqué que tu as compta et Compta
    de plus ne pas oublier d'exclure l’entête

    l'appel a un service web pour générer un mot de passe est un peu fort ?
    avec /dev/urandom et/ou md5sum c'est possible

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    +1 pour papajoker, voici un exemple avec urandom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ XX=$(< /dev/urandom tr -dc _A-Z-a-z-0-9%./\| | head -c${1:-8})
    $ echo $XX
    FFNwj.tw

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Par défaut
    Bon après avoir réalisés plusieurs tests, j'ai finalement décidé d'utiliser en début de script :

    dos2unix /home/toto/fichier-edit.csv

    Et ainsi de filtrer ma variable $Permanent sur = "Oui" et cela fonctionne parfaitement maintenant... encore merci pour le rappel sur le "cat -A .."

    Merci Papajoker je vais tester le test de cet façon histoire de voir comment celui-ci fonctionne et le comprendre ^^ (je commence à peine le shell )

    Par contre pour le répertoire Compta et compta .. j'avais eu la même réflexion que toi .. en me disant "tiens le prof veux nous piéger (création de doublon etc..)" mais justement quand je lui ai montré il m'a dit que en effet cela était normal et qu'il voulait bien 2 folders "compta" et "Compta". ce que je trouve totalement ... bref

    Et pour la partie password je voulais faire quelques choses de vraiment "fun" pour dire "a tiens il a eu l'idée de faire ça comme sa". Je me suis dit que cela pouvait être fun (malgré que cela doit ajouter une certaines latence au script donc loin de moins l'idée de l'avoir fait dans l'optique de la performance).


    Merci pour votre aide maintenant je dois faire une sorte de fonction debug pour faire un logfile pour ce script..

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Par défaut
    Bonjour à vous je reviens vers vous pour encore un petit soucis dans ma boucle au niveau création utilisateur.

    Je souhaitais ajouter un deuxième check au début de ma boucle if, si ma condition Permanent == "Oui" et que $Identifiant est déjà présent dans le fichier /etc/passwd then je créer le user.

    j'ai pour le coup écris ceci mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    check=`cat /etc/passwd | cut -d: -f1 | grep $Identifiant`
            echo "$check CECI EST LE TEST ECHO";
            if [ "$Permanent" == "Oui" ] || [ "$check" != "$Identifiant" ];then
                    pwd=`curl --silent http://www.sethcardoza.com/api/rest/tools/random_password_generator`
                    echo "$date_time ---- ID: $Identifiant -- PWD: $pwd -- Prénom: $Prenom -- Nom: $Nom -- Acc.Perma: $Permanent" >> data-connexion.txt
                    useradd "$Identifiant" -p "$pwd" -d "/home/$Service/$Prenom$Nom" -e "" -g "$Service"
                    chown -R "$Identifiant":"$Service" "/home/$Service/$Prenom$Nom"
            elif [ "$Permanent" == "Non" ] || [ "$check" != "$Identifiant" ];then
                    pwd=`curl --silent http://www.sethcardoza.com/api/rest/tools/random_password_generator`
                    echo "$date_time ---- ID: $Identifiant -- PWD: $pwd -- Prénom: $Prenom -- Nom: $Nom -- Acc.Perma: $Permanent" >> data-connexion.txt
                    useradd "$Identifiant" -p "$pwd" -d "/home/$Service/$Prenom$Nom" -e "$date_expire" -g "$Service"
                    chown -R "$Identifiant":"$Service" "/home/$Service/$Prenom$Nom"
            else
                    echo "Compte EXISTANT";
            fi
    car le fait d'utiliser uniquement le test sur la variable $Permanent , me spam mon fichier data-connexion car à chaque fois que je relance le script celui-ci tente toujours de créer les utilisateurs déjà présents (vue qu'il n'y avais pas de check de présence du user) et du coup cela me fausse mon fichier data étant donnée que le curl lui aussi s’exécute à nouveau pour un même user.

    Du coup je peux me retrouver avec plusieurs fois le même utilisateurs dans mon fichier data-connexion.txt avec un mdp différents pour le même compte d'où mon intérêt à ajouter un 2eme test check sur la variable $check.

    Ainsi si le test $Permanent == Oui ET $check n'est pas égal à $Identifiant alors je créer l'utilisateur sinon j'affiche juste "Compte existant".

    Je sais pas si je suis très clair et si il est faisable de faire un double check comme ceci.

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Si tu veux A && B, pourquoi fais-tu donc un A || B ?
    || c'est pour ou
    && c'est pour et

    En tout cas, dans ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$Permanent" == "Oui" ] || [ "$check" != "$Identifiant" ];then
    Oui est suffisant pour rentré dans le bloc de commande, l'autre test n'est même pas testé, il ne le sera que si le premier est faux.

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Par défaut
    oh je suis vraiment un boulet ..... j'avais utilisé || pour faire un test hier soir tard dans la nuit ......

    je me fatigue tout seul ..... quand cela saute au yeux on le vois pas (why!)

    du coup j'ai remplacé || par && ,
    justement comme sa je lui indique "si tu as Permanen == Oui ET $check différent de $Identifiant" alors tu exécute les commandes de création utilisateurs sinon j'affiche juste "COMPTE Existant"

    car dans ma variable $check je récupère le résultat de mon cat au dessus.

    En tout cas avec le bon opérateur LOGIQUE .. sa coule de source maintenant !

  12. #12
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Nota bene: grep utilise des expressions régulières (regular expressions = regex).
    Donc quand tu filtres l'identifiant, je te conseille de mettre un signe de début de ligne '^' et un signe de fin de ligne '$'.
    Sinon, "Jojo" est contenu dans "BadJojo" et ton check retourne plusieurs lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    check=$(cat /etc/passwd | cut -d: -f1 | grep "^${Identifiant}$" )

  13. #13
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    perso j'utiliserais plutôt une seule commande grep et ferais le test "check" dans la condition, cela ma parait plus facile a comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ $Permanent == "Oui" && !($(grep "^${Identifiant}:" /etc/passwd)) ]]; then
    de plus utiliser uniquement le code retour de grep (0 = trouvé) et non stdout

    ps: utiliser la case dans les nom de variable

  14. #14
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Une autre alternative:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ "$(grep -c ^${Identifiant}: /etc/passwd)$Permanent" = "0Oui" ]]; then

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par papajoker Voir le message
    perso j'utiliserais plutôt une seule commande grep et ferais le test "check" dans la condition, cela ma parait plus facile a comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ $Permanent == "Oui" && !($(grep "^${Identifiant}:" /etc/passwd)) ]]; then
    de plus utiliser uniquement le code retour de grep (0 = trouvé) et non stdout

    ps: utiliser la case dans les nom de variable
    Et pourquoi pas, plus simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$Permanent" = "Oui" ] && grep -q "^${Identifiant}:" /etc/passwd; then

Discussions similaires

  1. [Exercices] Liste d'exercices corrigés en shell script et bash
    Par ok.Idriss dans le forum Shell et commandes GNU
    Réponses: 47
    Dernier message: 10/03/2025, 14h09
  2. Exercice en bourne shell
    Par sk8trasher dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 03/03/2012, 18h35
  3. deux exercices de scripts shell à résoudre
    Par sadiqmrd dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 04/06/2011, 20h25
  4. Shell exercice débutant
    Par Larffas dans le forum Windows
    Réponses: 1
    Dernier message: 17/01/2007, 10h05
  5. Exercice linux shell
    Par satinrouge dans le forum Linux
    Réponses: 1
    Dernier message: 05/06/2006, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo