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 :

bash script suppression utilisateur


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut bash script suppression utilisateur
    Bonjour,

    Je suis en train de réaliser un script bash permettant de supprimer des comptes utilisateurs sur une VM.

    Ce script n'est pas parfait et je cherche à l'améliorer :

    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
    #!/bin/bash
     
    USERNAME=$1
     
     
    #Vérifier le compte de l'utilisateur à supprimer sur la VM
     
    if grep -q "$USERNAME" /etc/passwd;
    then
            echo -n "Confirmer le compte de la personne à supprimer : "
            read compte
    fi
     
    #Suppression utilisateur quittant ses fonctions au sein de l'équipe.
    for i in ${compte}
    do
            sudo userdel -r ${i}
            echo "le compte utilisateur $compte a bien été supprimé et n'existe plus dans les fichiers /etc/passwd /etc/group"
    done
     
     
    echo -e "Voulez-vous vérifier le fichier passwd [O/n] ?"
    read REP
     
    case $REP in
                 N|n)
                    exit
                 ;;
     
                 O|o|*)
                    echo -e " Constater la présence ou l'absence du fichier"
                    cat /etc/passwd
                 ;;
    esac

    pistes d'amélioration :

    - si j'indique un compte n'existant pas à l'appel du script je souhaiterais qu'il m'indique "ce compte n'existe pas"
    ex : ./delete_dev_user.sh toto


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ./delete_dev_user toto
    Ce compte n'existe pas. Rentrer un compte existant à supprimer

    Merci pour votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    J'ai apporté une modif qui fonctionne avec mon précédent message.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     #!/bin/bash
     2
     3 USERNAME=$1
     4
     5
     6 #Vérifier le compte de l'utilisateur à supprimer sur la VM
     7 if ! grep -q $USERNAME /etc/passwd;
     8 then
     9         echo "ce compte n'existe pas"
    10         exit
    11 else
    12         echo "le compte existe bien.Poursuite du script ..."
    13 fi
    14
    15 if grep -q "$USERNAME" /etc/passwd;
    16 then
    17         echo -n "Confirmer le compte de la personne à supprimer : "
    18         read compte
    19 fi
    20
    21 #Suppression utilisateur quittant ses fonctions au sein de l'équipe.
    22 for i in ${compte}
    23 do
    24         sudo userdel -r ${i}
    25         echo "le compte utilisateur $compte a bien été supprimé et n'existe plus dans les fichiers /etc/passwd /etc/group"
    26 done
    27
    28
    29         echo -e "Voulez-vous vérifier le fichier passwd [O/n] ?"
    30 read REP
    31
    32 case $REP in
    33                 O|o)
    34                  echo -e " Constater la présence ou l'absence du compte dans le fichier"
    35                  cat /etc/passwd
    36                 ;;
    37
    38                 N|n)
    39                 exit 0
    40                 ;;
    41 esac
    42
    43 echo -e "Voulez-vous vérifier le fichier group [O/n] ?"
    44 read REP1
    45
    46 case $REP1 in
    47              N|n)
    48                 exit
    49                 break
    50             ;;
    51
    52              O|o|*)
    53                 echo -e " Constater la présence ou l'absence du fichier"
    54                 cat /etc/group
    55             ;;
    56 esac

    En revanche je souhaiterais corrié un bug. En effet à cette partie du code ci dessous je souhaiterais lorsque je réponds "non" ou "n" ligne 29-30 le script aille à la question suivante. Ce qui n'est actuellement pas le cas.

    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 echo -e "Voulez-vous vérifier le fichier passwd [O/n] ?"
    30 read REP
    31
    32 case $REP in
    33                 O|o)
    34                  echo -e " Constater la présence ou l'absence du compte dans le fichier"
    35                  cat /etc/passwd
    36                 ;;
    37
    38                 N|n)
    39                 exit 0
    40                 ;;
    41 esac
    42
    43 echo -e "Voulez-vous vérifier le fichier group [O/n] ?"
    44 read REP1
    45
    46 case $REP1 in
    47              N|n)
    48                 exit
    49                 break
    50             ;;
    51
    52              O|o|*)
    53                 echo -e " Constater la présence ou l'absence du fichier"
    54                 cat /etc/group
    55             ;;
    56 esac

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    ne t'a-t-on pas encore parlé d'algorithme ?

    cela permet d'avoir une vision globale du déroulement du script, en détaillant de plus en plus finement (ça va de l'expression du besoin, à la rédaction de pseudo-code, en passant par le dessin de schémas/arbres décisionnels) toutes les opérations nécessaires à l'accomplissement de la tâche.
    l'algorithme est à rédiger avant d'écrire la moindre ligne de code.

    petit rappel : les noms de variables tout en majuscules sont, par convention, réservés aux variables d'environnement système (SHELL, HOME, LOGNAME, ...); les noms des variables définies par les utilisateurs peuvent être "panAchEs"
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par saga974 Voir le message
    Je suis en train de réaliser un script bash permettant de supprimer des comptes utilisateurs sur une VM.
    Pourquoi faire? Que fera-t-il de plus que userdel ne fait pas???

    Citation Envoyé par saga974 Voir le message
    3 USERNAME=$1
    Ok, et on lance le script sans argument... Ou alors (pourquoi pas) on le lance avec plusieurs utilisateurs et il ne traite que le premier...

    Citation Envoyé par saga974 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     6 #Vérifier le compte de l'utilisateur à supprimer sur la VM
     7 if ! grep -q $USERNAME /etc/passwd;
    Super. Moi je l'appelle avec le paramètre "home", juste pour voir, et là la litanie des erreurs ça me crame les yeux direct...

    Citation Envoyé par saga974 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     8 then
     9         echo "ce compte n'existe pas"
    10         exit
    11 else
    12         echo "le compte existe bien.Poursuite du script ..."
    Oh c'est trop bien ce "else" totalement inutile...

    Citation Envoyé par saga974 Voir le message
    for i in ${compte}
    Là je pige pas trop. Si "compte" c'est le compte à supprimer, à quoi sert cette boucle???

    Citation Envoyé par saga974 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sudo userdel -r ${i}
    echo "le compte utilisateur $compte a bien été supprimé et n'existe plus dans les fichiers /etc/passwd /etc/group"
    Donc voilà, tu supprimes $i (sans checker si la suppression s'est bien faite) et tu affiches "$compte"

    Citation Envoyé par saga974 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo -e " Constater la présence ou l'absence du compte dans le fichier"
    35                  cat /etc/passwd
    Ah oui, cash!!! Ton programme ne fait même pas le check. Il se contente juste d'afficher le fichier /etc/passwd et c'est à l'utilisateur de checker avec ses yeux si le compte y est ou n'y est plus
    Ca c'est un programme utile!!! Hautement calibré, aide à la décision et tout et tout...

    Citation Envoyé par saga974 Voir le message
    En revanche je souhaiterais corrié un bug.
    S'il n'y en avait qu'un...

    Citation Envoyé par saga974 Voir le message
    je souhaiterais lorsque je réponds "non" ou "n" ligne 29-30 le script aille à la question suivante. Ce qui n'est actuellement pas le cas.
    Normal, le "n" amène sur exit ce qui fait quitter le script...
    Mais bon, c'est qui qui l'a écrit ce "exit"? Il s'est écrit tout seul???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Faire un grep sur le fichier passwd pour vérifier l'existence de l'utilisateur est primitif. Cette implémentation n'est pas safe, on pourrait tomber sur un utilisateur qui n'est pas le bon, mais qui matche le pattern.

    On peut par exemple faire: id -u <user>et récupérer le exit code, si $? est différent de zéro l'utilisateur n'a pas été trouvé.
    Il y a aussi getent et d'autres méthodes auxquelles je ne pense pas.

    Il ne faut pas hésiter à faire une recherche sur Internet avant de réinventer la roue. Du genre: "Linux check user exists"

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    on peut faire un grep -q, mais il faut que le motif soit précis ^username:.

    primitif, primitif... traite-moi de réac' aussi* !

    --
    * ça fera l'équilibre avec ceux qui me traitent de gauchiste.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Bonjour à tous

    Merci pour vos retours.

    Bon je vois que les débuts de mon script sont pas foufous.

    Je vais prendre en compte vos retours en essayant d'appliquer ce que vous dites mais je ne garantis pas comprendre tout.

    Pour répondre à certaines interrogations :
    - svear :
    - Pourquoi faire ? --> réponse m'exercer à rédiger un script. En effet, une simple commande userdel suffit mais l'automatisation je trouve ca sympa
    - oui l'idée d'appliquer le script pour supprimer plusieurs comptes en même temps serait bien à l'appel du script
    - pouquoi le else est-il inutile ? je trouve intéressant de dire que le compte existe. Qu'est-ce qui aurait été mieux de faire du coup ?
    - for i in ${compte} : compte c'est la variable que je veux reprendre lorsque j'affiche le compte à supprimer. Comment aurais-je dû faire si ce n'est pas bon dans le script ?
    - $-i : je ne comprends pas ta remarque j'affiche le résultat en demandant la consultation dans les fichiers plus bas dans le script


    - binarygirl :
    - justement je veux demander une confirmation du bon compte à supprimer avec la bonne syntaxe dans le script. J'essaye d'implémenter ca dans le script mais je n'y arrive pas malgré des tests

    - N_BaH :
    - si je fais un grep ^$USERNAME: /etc/passwd est-ce suffisant



    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #!/bin/bash
     
    USERNAME=$1
     
     
    #Vérifier le compte de l'utilisateur à supprimer sur la VM
    if ! grep -q ^$USERNAME: /etc/passwd;
    then
    	echo "Ce compte n'existe pas. Rentrer un compte existant à supprimer" 
    	exit
    else
    	echo "le compte existe bien.Poursuite du script..."
    	grep ^$USERNAME: /etc/passwd
    	sleep 2
    fi
     
    	echo -n "Confirmer le compte de la personne à supprimer : "
    	read compte
     
     
    #Suppression utilisateur quittant ses fonctions au sein de la team
    for i in ${compte}
    do
    	sudo userdel -r ${i} 
    	echo "le compte utilisateur $compte a bien été supprimé et n'existe plus dans les fichiers /etc/passwd /etc/group" 
    done
     
     
    	echo -e "Voulez-vous vérifier le fichier /etc/passwd [O/n] ?"
    read rep
     
    case $rep in
    	     O|o)
                     echo -e "Constater la présence ou l'absence du compte dans le fichier";
                     cat /etc/passwd;
    		;;
     
    	     N|n)
    		;;
    esac
     
     
    echo -e "Voulez-vous vérifier le fichier /etc/group [O/n] ?"
    read rep1
     
    case $rep1 in 
                 O|o)
                    echo -e "Constater la présence ou l'absence du fichier";
                    cat /etc/group;
                    ;;
     
                 N|n)
    		exit 1
                    ;;
    esac

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    - Pourquoi faire ? --> réponse m'exercer à rédiger un script. En effet, une simple commande userdel suffit mais l'automatisation je trouve ca sympa
    Ok, c'est justifié.

    Citation Envoyé par saga974 Voir le message
    - oui l'idée d'appliquer le script pour supprimer plusieurs comptes en même temps serait bien à l'appel du script
    Il faut donc boucler sur $@

    Citation Envoyé par saga974 Voir le message
    - pouquoi le else est-il inutile ? je trouve intéressant de dire que le compte existe. Qu'est-ce qui aurait été mieux de faire du coup ?
    Ce n'est pas le message qui est inutile, c'est le "else". Si le script est sorti au "if", alors s'il n'est pas sorti c'est qu'on est implicitement dans le "else"
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ! grep -q "^$USERNAME:" /etc/passwd; then
    	echo "ce compte n'existe pas"
    	exit 1
    fi
    echo "le compte existe bien.Poursuite du script ..."
    ...

    Citation Envoyé par saga974 Voir le message
    for i in ${compte} : compte c'est la variable que je veux reprendre lorsque j'affiche le compte à supprimer. Comment aurais-je dû faire si ce n'est pas bon dans le script ?
    Première chose: la variable contenant le compte à supprimer est USERNAME. Avoir deux variables pour identifier une même notion est inutile et confusant. Mais surtout, si tu veux supprimer le compte "$compte", à quoi sert la boucle? Pourquoi une boucle pour supprimer un compte???

    Citation Envoyé par saga974 Voir le message
    - $-i : je ne comprends pas ta remarque j'affiche le résultat en demandant la consultation dans les fichiers plus bas dans le script
    Ce n'est pas à l'utilisateur de faire un travail que le script peut faire (sinon le script ne sert à rien). Si le compte n'y est plus, le script peut (doit) le voir et peut (doit) le dire en une phrase simple plutôt que balancer en vrac tout un fichier à l'écran en laissant à l'utilisateur le job de chercher avec ses yeux. On peut même aller plus loin en partant du fait que si la commande userdel s'est bien exécutée (et là il serait utile de vérifier son code retour), ce check de /etc/passwd ne sert à rien.

    Citation Envoyé par saga974 Voir le message
    - binarygirl :
    - justement je veux demander une confirmation du bon compte à supprimer avec la bonne syntaxe dans le script. J'essaye d'implémenter ca dans le script mais je n'y arrive pas malgré des tests
    Une boucle infinie
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while true; do
    	question: quel compte à supprimer
    	si compte existe break
    	afficher "compte incorrect, recommencez"
    done
    ... (ici on sait quel compte supprimer)
    Mais ce choix d'algo est en inadéquation avec l'idée d'un script qui recevrait les comptes à supprimer en paramètre.

    Citation Envoyé par saga974 Voir le message
    - si je fais un grep ^$USERNAME: /etc/passwd est-ce suffisant
    Oui mais je préfère de loin la commande de binarygirl. Plus rapide d'évaluer une commande simple que checker tout un fichier.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    J'ai essayé de prendre en compte les recommandations en fonction de mes compréhensions évidemment lol

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #!/bin/bash
     
    USERNAME=$@
     
     
    #Vérifier le compte de l'utilisateur à supprimer sur la VM de dev
    for USERNAME in $@
    do
    	if ! grep -q ^$USERNAME: /etc/passwd;
    then
    	echo "Ce(s) compte(s) n'existe(nt) pas. Rentrer un ou des compte(s) existant à supprimer"
    	exit 1
    	fi
    done
     
    echo "le(s) compte(s) existe(nt) bien.Poursuite du script..."
    	grep ^$USERNAME: /etc/passwd
    	sleep 2
     
    #Confirmation du compte
    echo -n "Confirmer le compte de la personne à supprimer : "
    read $USERNAME
     
     
    #Suppression utilisateur quittant ses fonctions au sein de l'équipe
     
    sudo userdel -r $USERNAME
    echo "le compte utilisateur $@ a (ou ont) bien été supprimé(s) et n'existe(nt) plus dans les fichiers /etc/passwd /etc/group"
     
     
    echo -e "Voulez-vous vérifier le fichier /etc/passwd [O/n] ?"
    read rep
     
    case $rep in
    	     O|o)
                     echo -e "Constater l'absence du compte dans le fichier";
                     cat /etc/passwd;
    		;;
     
    	     N|n)
    		;;
    esac
     
     
    echo -e "Voulez-vous vérifier le fichier /etc/group [O/n] ?"
    read rep1
     
    case $rep1 in 
                 O|o)
                    echo -e "Constater l'absence du groupe dans le fichier";
                    cat /etc/group;
                    ;;
     
                 N|n)
    		exit 1
                    ;;
    esac

    Le problème auquel je suis confronté avec la boucle for c'est que lorsque j’appelle mon script avec plusieurs paramètres donc plusieurs comptes à supprimer ca bug complètement.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ex : sudo /delete_dev_user.sh testcompte testcompte1

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 284
    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 284
    Par défaut
    bonjour
    Citation Envoyé par saga974 Voir le message
    ca bug complètement.
    Vu ton message d'erreur (ou autre) si explicite, c'est que ... (désolé, je n'ai pas ma boule de cristal)

    Note: dans ta boucle, si utilisateur non trouvé, tu quittes. Tu pourrais faire un simple saut ? (continue) et faire le travail dans cette même boucle

    ligne 17 : n'a pas de sens puisque pas dans la bouche ... ou alors ne pas utiliser 2 fois(voir plus?) le nom USERNAME pour des choses bien différentes.

    Tu demandes "Confirmation du compte" mais tu ne testes même pas si c'est exact

    exemple (avec 3 variables différentes !):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    USERNAMES = paramètres du script
    pour USERNAME est dans USERNAMES faire
         si USERNAME pas dans fichier exit 1  # (et tester si est un utilisateur et pas un service ! et pas root !!!!)
         testname= demande "confirmer $USERNAME :"
         si testname différent USERNAME alors continue
     
         supprimer le compte USERNAME et répertoire
         tests si bien supprimé
    N_BaH avait parlé de "rédaction de pseudo-code", (donc indépendant du langage) nous ne sommes pas des sur-humains, si nous ne le faisons pas (au moins mentalement si très simple) c'est le mur assuré. Tu sembles avoir complètement zappé ce préalable .
    Coder avant cette étape, c'est simplement partir avec un énorme boulet aux pieds (et surtout un bandeau sur les yeux)

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    lol
    Ouais, lol

    Citation Envoyé par saga974 Voir le message
    USERNAME=$@
    Bon, quand je dis "il faut boucler sur", cela induit une notion élémentaire de l'algorithmique: la boucle...


    Citation Envoyé par saga974 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #Vérifier le compte de l'utilisateur à supprimer sur la VM de dev
    for USERNAME in $@
    Ah, enfin, la boucle y est.

    Citation Envoyé par saga974 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do
    	if ! grep -q ^$USERNAME: /etc/passwd;
    then
    	echo "Ce(s) compte(s) n'existe(nt) pas. Rentrer un ou des compte(s) existant à supprimer"
    	exit 1
    	fi
    done
    Déjà un manque de tabulations qui permettrait de mieux faire ressortir les blocs de contrôle mais surtout ce n'est pas parce qu'un des comptes de la liste n'existe pas, qu'il faut benner la liste entière aux ordures. Il faudrait que tu arrives à te représenter ce qui va se passer quand tu tapes tes instructions (et avoir un peu d'empathie pour te mettre à la place de l'utilisateur)

    Citation Envoyé par saga974 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "le(s) compte(s) existe(nt) bien.Poursuite du script..."
    	grep ^$USERNAME: /etc/passwd
    	sleep 2
    Ah, ben ok, là on n'est plus dans la boucle. On a demandé la suppression de 10 users, seul le dernier sera supprimé.
    N_BaH a fait une remarque assez intéressante à propos de l'algorithme. Peut-être donc que commencer par là serait un plus...

    Citation Envoyé par saga974 Voir le message
    Le problème auquel je suis confronté avec la boucle for c'est que lorsque j’appelle mon script avec plusieurs paramètres donc plusieurs comptes à supprimer ca bug complètement.
    J'aime bien cette description, je vais la reformuler: le problème auquel tu es confronté avec la boucle for c'est que tu ne sais pas pourquoi tu l'as mise...

    Citation Envoyé par papajoker Voir le message
    ... et surtout un bandeau sur les yeux...
    ... en marchant au bord d'une falaise.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Citation Envoyé par sve@r
    Oui mais je préfère de loin la commande de binarygirl. Plus rapide d'évaluer une commande simple que checker tout un fichier.

    parce que tu crois que getent et id sortent l'info de ... ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    parce que tu crois que getent et id sortent l'info de ... ?
    Ok, je reformule (c'est vrai que fatalement l'info est quand-même issue d'un fichier) : je préfère de loin la commande de binarygirl qui semble faite pour ça plutôt que de taper dans un fichier système qui n'est pas forcément toujours le bon (certains outils, tels les yellow pages, n'utilisent pas /etc/passwd)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 284
    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 284
    Par défaut
    En fait, il faudrait avoir un véritable cahier des charges pour trouver le/les bons outils
    Si on désire sécuriser la chose, utiliser des outils me semble plus simple (sauf filtre sur id)
    peut-être erreur si user est Pas dans wheel/root ou mieux, accepter que si user est dans le group "xxx" ?
    (note, avec systemd, nous avons en plus userdbctl)

    Et avec systemd (homed), /etc/passwd n'est plus forcément la référence

  15. #15
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Bonjour tout le monde,

    Bon je pense être en accord avec moi même sur le script. Quand je dis avec moi même je sais bien que ce ne sera pas le script du siècle et qu'il est certainement améliorable mais disons qu'il fait ce pourquoi je cherchais à m'exercer à l'origine.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #!/bin/bash
     
    USERNAME=$@
    NOCOLOR='\033[0m'
    RED='\033[1;31m'
    GREEN='\033[1;32m'
     
    #Vérifier le compte de l'utilisateur à supprimer sur la VM.
    for USERNAME in $@
    do
    	if ! grep -q ^$USERNAME: /etc/passwd;
    then
    	echo -e "Ce(s) compte(s) : ${GREEN}$@${NOCOLOR} n'existe(nt) pas. Rentrer un ou des compte(s) existant à supprimer" 
    	exit 1 
    	fi
    done
     
     
    echo -e "Le(s) compte(s) :  ${GREEN}$@${NOCOLOR} existe(nt) bien.Poursuite du script..."
     
    #Affichage du ou des comptes
    for USERNAME in $@
    do
    	grep --color='auto' ^$USERNAME: /etc/passwd
    	sleep 1
    done
     
    #Confirmation du ou des compte(s) à supprimer
    echo -e "Confirmer-vous que le(s) compte(s) ${GREEN}$@${NOCOLOR} sont à supprimer [O/n] ? : "
    read rep
     
    case $rep in
    	O|o)
    	;;
     
    	N|n)
    	exit 1
    	;;
    esac
     
    #Suppression du ou des comptes confirmés
    for USERNAME in $@
    do
    	sudo userdel -r $USERNAME >/dev/null 2>&1 
    done
     
     
    echo -e "Le(s) compte(s) utilisateur(s)  ${GREEN}$@${NOCOLOR} a ou ont bien été supprimé(s) et n'existe(nt) plus dans les fichiers /etc/passwd /etc/group"
     
     
    #Demande de vérification de la suppression des comptes dans les fichiers passwd et group
     
    #### FICHIER /etc/passwd #######
    echo -e "Voulez-vous vérifier la suppression du ou des compte(s) dans le fichier /etc/passwd [O/n] ?"
    read rep
    case $rep in
    	O|o) grep -q ^$USERNAME: /etc/passwd && echo -e "Le(s) compte(s) ${GREEN}$@${NOCOLOR} est/sont toujour(s) présent(s)" \
    || echo -e "Le(s)compte(s)${GREEN}$@${NOCOLOR} est/sont bien supprimé(s)";
    	;;
    	N|n)
    	;;
    esac
     
     #### FICHIER /etc/group #######
    echo -e "Voulez-vous vérifier la suppression du ou des comptes(s) dans le fichier /etc/group [O/n] ?"
    read rep1
     
    case $rep1 in
    	O|o)
    	grep -q ^$USERNAME: /etc/passwd && echo -e "Le(s) compte(s) ${GREEN}$@${NOCOLOR} est/sont toujour(s) présent(s)" \
    || echo -e "Le(s)compte(s) ${GREEN}$@${NOCOLOR} est/sont bien supprimé(s)";
            ;;
     
            N|n)
    	exit 1
            ;;
    esac
    Évidemment vous me direz il y a mieux et que l'utilité du script dont la finalité de l'action peut être réalisée en une commande est tout à fait critiquable. J'accepte évidemment.

    Vous allez aussi me dire quel est l'intérêt de vérifier une commande qui on est sûr déjà qu'elle supprime ce qui doit être supprimé. Justement c'est la vérification. Quel est l’intérêt de vérifier que la porte de la voiture est déjà fermée alors que l'on à appuyer sur le bouton verrouiller de la commande de la clé ? Justement en être sûr plutôt 2 fois qu'une.

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Vous allez aussi me dire quel est l'intérêt de vérifier une commande qui on est sûr déjà qu'elle supprime ce qui doit être supprimé. Justement c'est la vérification. Quel est l’intérêt de vérifier que la porte de la voiture est déjà fermée alors que l'on à appuyer sur le bouton verrouiller de la commande de la clé ? Justement en être sûr plutôt 2 fois qu'une.
    Justement, c'est la procédure de vérification qui doit être plus intelligente. La majorité des commandes Linux renvoient un exit code, il faut donc examiner ce code de retour pour évaluer si l'opération précédente s'est déroulée correctement.
    Or, vous ne le faites pas.

    Et comme vous envoyez stderr vers /dev/null, vous ne verrez pas les erreurs éventuelles à l'oeil nu.

    Ca tombe bien, userdel fournit différents exit codes en fonction du problème rencontré: https://linux.die.net/man/8/userdel

    Donc, ce que vous faites n'apporte pas encore de valeur ajoutée, c'est un wrapper autour de userdel qui ne fournit pas de fonctionnalité supplémentaire intéressante.
    Ce script est plutôt dangereux, je pense qu'il serait judicieux d'inclure des garde-fou pour qu'on ne puisse pas effacer l'utilisateur en cours et root.
    Mais là vous avez de la chance, userdel est manifestement assez intelligent pour ne pas supprimer un utilisateur déjà loggé (exit code 8).

    Conclusion: il ne faut pas réinventer une fonctionnalité qui existe déjà.

    Et comme l'a fait remarquer Papajoker, /etc/passwd n'est plus forcément la référence avec homed, et peut-être sur des distros moins courantes. Gardez donc en tête qu'il n'est probablement pas 100% portable.

    A vrai dire, supprimer des utilisateurs n'est pas une tâche courante, je préférerais automatiser d'autres choses.

  17. #17
    Membre émérite
    Homme Profil pro
    Architecte cybersécurité
    Inscrit en
    Avril 2014
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte cybersécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 563
    Par défaut
    Hello,

    /etc/passwd n'a jamais été une référence, c'est NSS la référence (avec potentiellement son démon de cache NSCD, accessible via la commande getent).

    je te déconseille fortement d'automatiser une suppression utilisateur, garde juste ton script comme un entrainement mais ne mets jamais ça en production.

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for USERNAME in $@
    do
    	if ! grep -q ^$USERNAME: /etc/passwd; then
    		echo -e "Ce(s) compte(s) : ${GREEN}$@${NOCOLOR} n'existe(nt) pas. Rentrer un ou des compte(s) existant à supprimer" 
    		exit 1 
    	fi
    done
    Vous allez aussi me dire quel est l'intérêt de vérifier une commande...
    Non, moi je vais te redire en plus explicite ce que j'ai déjà dit: ce n'est pas parce qu'une liste (de par exemple 5 éléments) contient un élément incorrect qu'il faut purger les 4 bons éléments restant (ce que tu fais ici via ton exit 1).

    Citation Envoyé par saga974 Voir le message
    Justement c'est la vérification.
    Oui mais ton script ne vérifie justement pas. Il envoie juste le fichier /etc/passwd à l'écran en vrac en laissant à l'utilisateur le soin de vérifier manuellement si le compte a ou n'a pas été supprimé. Et c'est ce "manuellement" qui ne va pas. Que fais-tu si le fichier contient 500 lignes (après-tout, on peut très bien travailler sur un gros système) alors que seules les 24 dernières s'affichent au final (les 476 autres ayant été affichées aussi mais ensuite sont parties dans le défilement) ?
    Et comment peux-tu dire que c'est vérifié si par exemple le user n'a pas été supprimé mais que la ligne le contenant n'est plus à l'écran (parce que partie)?

    Citation Envoyé par saga974 Voir le message
    Quel est l’intérêt de vérifier que la porte de la voiture est déjà fermée alors que l'on à appuyer sur le bouton verrouiller de la commande de la clé ? Justement en être sûr plutôt 2 fois qu'une.
    Justement je ne vérifie pas de cette façon. Déjà parce que quand j'appuie sur le bouton j'entends "clac" et je vois les clignotants s'allumer brièvement (indication visuelle et auditive) et en plus parce que si j'appuie sur la portière avec la clef à proximité, ça déverrouille automatiquement.
    Donc je m'appuie sur les indicateurs qui me sont offerts. A toi d'en faire autant. Tu peux, comme l'a dit binarygirl, checker le retour des commandes pour vérifier si la commande a ou n'a pas réussi (et là c'est le script qui fait le job donc c'est présumé être fiable). Tu peux aussi refaire un id -u user après voir si l'user réapparait ou ne réapparait pas. Bref c'est justement l'avantage d'un script: pouvoir assurer à l'utilisateur que le travail a été fait sans que l'utilisateur n'ait à se fatiguer.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Svear,

    Je pars du principe que la personne au préalable avant de lancer le script à déjà fait un cat /etc/passwd et s'aperçoit que des comptes n'ont plus vocation à exister. Il lance ensuite le script en indiquant l'ensemble des comptes à supprimer et qu'il aura jugé utile de supprimer. Est ce que c'est plus compréhensible ainsi ?

  20. #20
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Est ce que c'est plus compréhensible ainsi ?
    Je ne me base pas sur tes explications, mais sur les actions de ton script. Si le script est écrit sur le principe qu'il sera appelé avec une liste de compte corrects, je ne vois pas l'utilité de la boucle de test si les comptes existent ou pas.
    Mais si la boucle est là pour tester et prévenir l'utilisateur que certains comptes sont incorrects (n'existent pas) ok. Mais dans ce cas je ne vois pas pourquoi, une fois les comptes incorrect éliminés, le script ne traite pas ensuite les comptes corrects qui, eux, restent quand-même à supprimer. Bref l'idée que tu m'expliques c'est pas à moi qu'il faut l'expliquer, c'est à ton script.

    J'ai l'impression de voir un script à l'image de l'administration : une seule case mal remplie dans un formulaire et il faut refaire tout le formulaire.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [Shell] Bash : script de gestion d'utilisateurs
    Par techafi dans le forum Linux
    Réponses: 1
    Dernier message: 14/03/2008, 22h13
  2. [MySQL] Suppression utilisateur d'une table
    Par djinko dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/12/2006, 15h50
  3. [MySQL] Suppression Utilisateurs de la BDD
    Par djinko dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/11/2006, 08h30
  4. Réponses: 2
    Dernier message: 24/05/2006, 13h00
  5. Probleme avec mon bash script
    Par spynux dans le forum Linux
    Réponses: 1
    Dernier message: 30/03/2006, 09h21

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