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

Linux Discussion :

[shell] Problème récupération de chaîne


Sujet :

Linux

  1. #1
    Membre confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut [shell] Problème récupération de chaîne
    Bonjour,
    j'essai tant bien que mal de mettre en pratique les astuces des membres de ce forum qui son très enrichissantes.

    Voici mon problème,

    Je doit récupérer le chemin absolu du répertoire utilisateur dans /etc/passwd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    john:x:1003:1002:,,,:/home/www/john:/bin/false
    j'ai fait un:
    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
    echo -n "Chemin absolu vers son répertoire FTP ? : "
    read chroot
     
    abs=`grep $chroot /etc/passwd | awk -F: '{ print $6 }'`
    grep "^$abs" /etc/passwd 1>/dev/null
    if [ $? -ne 1 ]; then
    	echo "Vérification..." 
    sleep 1
    	echo "Le répertoire $chroot ne correspond pas avec celui de $user"
    	echo "on ne peut donc pas l'ajouter au serveur FTP"
    	echo "Arrêt..."
    	echo
    exit 1
    else
    	echo "Vérification..."
    sleep 1
    	echo "OK le répertoire correspond..."
    fi
    et résultat...ça marche à moitier car si je tappe /home/www/joh il me dit qu'il existe.
    Si je tappe /home/www/johnny il travail bien et il me dit qu'il n'existe pas.
    Si je tappe /home/www/ il travail bien aussi et me dit qu'il n'existe pas.
    Bref, tout ce qui se trouve entre /home/www/j et /home/www/joh il me l'accepte alors qu'il ne devrait accepter que /home/www/john.

    Une idée ?

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    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 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par loopback Voir le message
    Bonjour,
    j'essai tant bien que mal de mettre en pratique les astuces des membres de ce forum qui son très enrichissantes.

    Voici mon problème,

    Je doit récupérer le chemin absolu du répertoire utilisateur dans /etc/passwd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    john:x:1003:1002:,,,:/home/www/john:/bin/false
    j'ai fait un:
    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
    echo -n "Chemin absolu vers son répertoire FTP ? : "
    read chroot
     
    abs=`grep $chroot /etc/passwd | awk -F: '{ print $6 }'`
    grep "^$abs" /etc/passwd 1>/dev/null
    if [ $? -ne 1 ]; then
    	echo "Vérification..." 
    sleep 1
    	echo "Le répertoire $chroot ne correspond pas avec celui de $user"
    	echo "on ne peut donc pas l'ajouter au serveur FTP"
    	echo "Arrêt..."
    	echo
    exit 1
    else
    	echo "Vérification..."
    sleep 1
    	echo "OK le répertoire correspond..."
    fi
    et résultat...ça marche à moitier car si je tappe /home/www/joh il me dit qu'il existe.
    Si je tappe /home/www/johnny il travail bien et il me dit qu'il n'existe pas.
    Si je tappe /home/www/ il travail bien aussi et me dit qu'il n'existe pas.
    Bref, tout ce qui se trouve entre /home/www/j et /home/www/joh il me l'accepte alors qu'il ne devrait accepter que /home/www/john.

    Une idée ?
    Si je lis bien ce code, la variable "abs" contient le 6° champ de la ligne considérée. Alors pourquoi chercher "$abs" en début de ligne (grep "^$abs") ???

    Bon ça c'était pour corriger le code. Mais d'un point de vue plus général, l'algo est mal conçu
    1) tu commences par récupérer le 6° champ d'un hypothétique utilisateur
    2) tu vérifies que ce que t'as récupéré existe (pour vérifier que l'utilisateur existe ???) => bref j'y comprends rien (et toi ???)

    Voici comment moi j'aurais fait
    1) récupérer la ligne commençant par le nom cherché
    2) si cette ligne existe (=> donc que le nom est ok) alors en extraire le 6° champ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    echo -n "Entrez le nom cherché : "
    read user
     
    ligne=`grep "^$user:" /etc/passwd`
    if test -n "$ligne"               # Si la ligne n'est pas vide le user existe
    then
         rep=`echo $ligne |cut -f6 -d:`
         echo "$user => $rep"
    else                       # Si la ligne est vide le user n'existe pas
         echo "$user n'existe pas
    fi
    PS: j'aime pas ce nom de variable "chroot" car il est synonyme de la commande "chroot" et peut prêter à confusion. On sent qu'un algorithme est bien conçu et robuste quand les noms de variables représentent bien leur rôle...
    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]

  3. #3
    Membre confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    PS: j'aime pas ce nom de variable "chroot" car il est synonyme de la commande "chroot" et peut prêter à confusion. On sent qu'un algorithme est bien conçu et robuste quand les noms de variables représentent bien leur rôle...
    Oui j'ai modifier par "dir" qui correspond mieux.

    Mais le but recherché ici c'est d'ajouter un utilisateur à un service (ici FTP) que si l'utilisateur existe dans le système, s'il n'existe pas on arrête.

    La seconde chose est d'ajouter pour se meme utilisateur un répertoire de connexion à son espace FTP qui correspond exactement au répertoire de son espace utilisateur dans le système.

    La personne qui lance le script n'as pas toujours les compétences d'un admin et donc s'il se trompe dans le chemin alors le script lui dit.
    Car le serveur ftp lui créera le dossier où celui-ci là indiqué (imagine qu'il le crée dans /etc/passwd) lol

    Ta méthode est rapide, simple et efficace.
    Je vais m'orienter vers ta solution.
    encore merci.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    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 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par loopback Voir le message
    La personne qui lance le script n'as pas toujours les compétences d'un admin et donc s'il se trompe dans le chemin alors le script lui dit.
    C'est encore mieux quand le script a les infos suffisantes pour trouver par lui-même le chemin qu'il faut...

    Citation Envoyé par loopback Voir le message
    Ta méthode est rapide, simple et efficace. Je vais m'orienter vers ta solution.
    Bah... 20 ans de shell ça aide...
    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 confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bah... 20 ans de shell ça aide...
    A la tienne.

    C'est encore mieux quand le script a les infos suffisantes pour trouver par lui-même le chemin qu'il faut...
    Bon voilà le topo,
    J'en reviens à ton conseil, en fait ici on demande d'ajouter un répertoire existant au compte FTP, il me suffit de ne pas faire la demande via script et de l'ajouter automatiquement dés que l'on donne le nom d'utilisateur à ajouter.
    Comme ça on ne risque pas de se tromper de path

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dir=`grep $user /etc/passwd | awk -F: '{ print $6 }'`

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    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 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par loopback Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dir=`grep $user /etc/passwd | awk -F: '{ print $6 }'`
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dir=`grep "^$user:" /etc/passwd | awk -F: '{ print $6 }'`
    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]

  7. #7
    Membre confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    Un autre problème auquel je n'avais pas penser.
    Si l'utilisateur met root ou rien
    il faudrait qu'il mette pour le 1
    veuillez indiquer un login différent de root!
    et pour le 2
    Veuillez indiquer un login!
    Il lira le fichier et il trouvera toujours root si c'est la cas.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    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 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par loopback Voir le message
    Un autre problème auquel je n'avais pas penser.
    Si l'utilisateur met root ou rien
    il faudrait qu'il mette pour le 1
    veuillez indiquer un login différent de root!
    et pour le 2
    Veuillez indiquer un login!
    Il lira le fichier et il trouvera toujours root si c'est la cas.
    La philosophie générale de ce genre de script est que l'info dont il a besoin ne soit pas demandée durant le script mais passée par argument lorsque le script est lancé. D'ailleurs je pense que tu préfères taper "cp fic1 fic2" plutôt que taper "cp", attendre que le programme te demande le nom du fichier à copier, puis le nom de la copie.

    Sinon pour répondre à ton problème, voici l'algo de saisie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while true
    do
         echo "Nom de l'utilisateur"
         read user
     
         test -n "$user" -a "$user" != "root" && break
         echo "Veuillez entrer un user différent de 'root' et non vide..."
    done
    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é Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    merci pour cette commande je ne connaissais pas.

    Par rapport ce script j'aurais voulu pousser un peu plus loin la vérification à tous les nom interdits comme daemon et www-data.
    Alors j'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while true
    do
    	echo -n "Ajoutez un login FTP (ctrl+c pour arrêter) : "
    read user
    test -n "$user" -a "$user" != "root" && break
        echo "Veuillez entrer un login différent de 'root' et non vide!!!"
    done
    else
    while true
    do
    test -n "$user" -a "$user" != "daemon" && break
    	echo "Veuillez entrer un login différent de 'daemon' et non vide!!!"
    done
    mais il me met le message 'Veuillez entrer un login différent de 'daemon' et non vide!!!' en boucle.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    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 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par loopback Voir le message
    merci pour cette commande je ne connaissais pas.
    Il ne s'agit pas d'une commande, il s'agit d'un algorithme (utilisant des commandes de base) permettant de refuser à l'infini une saisie invalide...

    Citation Envoyé par loopback Voir le message
    Par rapport ce script j'aurais voulu pousser un peu plus loin la vérification à tous les nom interdits comme daemon et www-data.
    Alors j'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while true
    do
    	echo -n "Ajoutez un login FTP (ctrl+c pour arrêter) : "
    read user
    test -n "$user" -a "$user" != "root" && break
        echo "Veuillez entrer un login différent de 'root' et non vide!!!"
    done
    else
    while true
    do
    test -n "$user" -a "$user" != "daemon" && break
    	echo "Veuillez entrer un login différent de 'daemon' et non vide!!!"
    done
    mais il me met le message 'Veuillez entrer un login différent de 'daemon' et non vide!!!' en boucle.
    Parce que t'as pas compris mon algo
    1) j'initialise une boucle infinie
    2) je fais saisir un élément
    3) si cet élément n'est pas un élément interdit, alors je sors de la boucle et donc j'arrive après le "done" avec un élément valide à traiter
    4) si cet élément est interdit, je ne sors donc pas de la boucle et passe sur la ligne suivante qui m'affiche le message d'erreur et retourne à la saisie

    Pourquoi donc as-tu instancié une seconde boucle dans le "else" ???

    Reprends ton algo. Quand il marchera, je te montrerai alors un autre truc qui te permettra de faire des modif (rajouter ou enlever des éléments interdits) plus facilement...
    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]

  11. #11
    Membre confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    Merci,
    Pourquoi donc as-tu instancié une seconde boucle dans le "else" ???
    je pensais que ça marcherais mais non...

    L'algo marche bien comme ça mais je ne vois pas comment rajouter des trucs en plus interdits, comme un second login qui est interdit...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while true
    do
    	echo -n "Ajoutez un login FTP (ctrl+c pour arrêter) : "
    read user
    test -n "$user" -a "$user" != "root" && break
        echo "Veuillez entrer un login différent de 'root' et non vide!!!"
    done

  12. #12
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Il faut que tu comprennes la logique.

    La commande test sert à... effectuer un test. Ce test renvoie soit 0 (vrai), soit 1 (faux). Pour les détails : man test.
    Le "&&" est un opérateur qui exécute la 2e commande si la 1ere commande a renvoyé 0.
    L'instruction "break" sert à sortir de la boucle.

  13. #13
    Membre confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    Citation Envoyé par LLB Voir le message
    Il faut que tu comprennes la logique.

    La commande test sert à... effectuer un test. Ce test renvoie soit 0 (vrai), soit 1 (faux). Pour les détails : man test.
    Le "&&" est un opérateur qui exécute la 2e commande si la 1ere commande a renvoyé 0.
    L'instruction "break" sert à sortir de la boucle.
    J'ai fait un 'man test':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     EXPRESSION1 -a EXPRESSION2
                  EXPRESSION1 et EXPRESSION2 sont vraies
     
           -n CHAÎNE
                  la longueur de CHAÎNE est non nulle
     
     CHAÎNE1 != CHAÎNE2
                  les deux chaînes sont différentes
    Donc si je comprend bien ton algo:
    si la longueur de la chaîne est non nulle et que les deux expression sont vraies et différente de 'root' exécuter la commande break que si la première commande est un succès.

    C'est bien ça ?
    Je continue mes tests...

  14. #14
    Membre confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    Voici ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	while true
    do
    	echo -n "Ajoutez un login FTP (ctrl+c pour arrêter) : "
    read user
    test -n "$user" -a "$user" != "root" && break \
    | test -n "$user" -a "$user" != "daemon" && break \
    | test -n "$user" -a "$user" != "www-data" && break
        echo "Veuillez entrer un login différent de 'root' et non vide!!!"
    done
    il me renvoi toujours le me echo 'root' si c'est daemon ou www-data

    ou ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	while true
    do
    	echo -n "Ajoutez un login FTP (ctrl+c pour arrêter) : "
    read user
    test -n "$user" -a "$user" != "root" && break \
    | test -n "$user" -a "$user" != "daemon" && break \
    | test -n "$user" -a "$user" != "www-data" && break
        echo "Veuillez entrer un login différent et non vide!!!"
    done

    J'y suis presque...

    Note:ça serait bien plus simple de mettre une commande pour interdire tous les UID inférieur à 999

  15. #15
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Presque... pourquoi mets-tu tout en une seule commande ?
    Pourquoi utilises-tu un pipe ?

    Mets tes commandes les unes à la suite des autres, sans les chainer, ça marchera mieux.

  16. #16
    Membre confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    Citation Envoyé par LLB Voir le message
    Presque... pourquoi mets-tu tout en une seule commande ?
    Pourquoi utilises-tu un pipe ?

    Mets tes commandes les unes à la suite des autres, sans les chainer, ça marchera mieux.
    je met le pipe pour exécuter la commande si le login corresspond à une de ces chaînes...

    Mais je saisi pas ce que tu veux dire par:
    Mets tes commandes les unes à la suite des autres, sans les chainer, ça marchera mieux.

  17. #17
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Le pipe sert à exécuter deux commandes en parallèle : la sortie de la 1e commande est reliée à l'entrée de la 2e. Tu n'en as pas besoin ici (ça n'a pas vraiment de sens, tes commandes ne renvoient rien).

    Si tu enlèves les \ et les |, ça marche pas ?

  18. #18
    Membre confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    Citation Envoyé par LLB Voir le message
    Le pipe sert à exécuter deux commandes en parallèle : la sortie de la 1e commande est reliée à l'entrée de la 2e. Tu n'en as pas besoin ici (ça n'a pas vraiment de sens, tes commandes ne renvoient rien).

    Si tu enlèves les \ et les |, ça marche pas ?
    Non ça ne marche pas

  19. #19
    Membre confirmé Avatar de loopback
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 170
    Par défaut
    Delete......

  20. #20
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    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 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par loopback Voir le message
    Voici ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	while true
    do
    	echo -n "Ajoutez un login FTP (ctrl+c pour arrêter) : "
    read user
    test -n "$user" -a "$user" != "root" && break \
    | test -n "$user" -a "$user" != "daemon" && break \
    | test -n "$user" -a "$user" != "www-data" && break
        echo "Veuillez entrer un login différent de 'root' et non vide!!!"
    done
    il me renvoi toujours le me echo 'root' si c'est daemon ou www-data
    Ben normal, le message final n'a pas été modifié. De plus, t'as pas bien saisi ma ligne "test" où je testais "user non vide" ET "user différent de root". Suffisait de rajouter des "ET" (-a)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while true
    do
    	echo -n "Ajoutez un login FTP (ctrl+c pour arrêter) : "
    read user
         test -n "$user" -a "$user" != "root" -a "$user" != "daemon" -a "$user != "www-data" && break
        echo "Veuillez entrer un login différent de 'root' et 'daemon' et 'www-data' et non vide!!!"
    done
    Ou alors utiliser la structure "cas multiple"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while true
    do
         echo -n "Ajoutez un login FTP (ctrl+c pour arrêter) : "
         read user
         case $user in
               "root")
               "daemon")
               "www-data")
                     echo "Cet user '$user' est interdit";;
               "")
                     echo "Pas d'user vide";;
               *) break   # On sort de la saisie ici car ici on est dans le cas d'un user valide
           esac
    done
    Ou alors boucler sur une liste des user interdits et vérifier que ton user ne s'y trouve pas
    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
    while true
    do
         echo -n "Ajoutez un login FTP (ctrl+c pour arrêter) : "
         read user
     
         # On considère que l'user est bon et on cherche un mauvais
         ok="ok"
     
         for bad in root daemon www-data  # On peut en mettre autant qu'on veut
         do
              if test "$user" = "$bad"
              then
                   # On a trouvé un user mauvais - On efface le flag
                   unset ok
     
                   # Plus la peine de vérifier les autres
                   break
              fi
          done
     
          # Si le flag est toujours présent on quitte la saisie
          test -n "$ok" && break
     
          # On n'a pas quitté la saisie => on avait donc un mauvais user
          echo "Cet user '$user' est interdit";;
    done
    Bon, ce dernier algo ne teste pas les user vides mais c'est (pour moi) un détail...
    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]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/05/2007, 12h10
  2. [MySQL] Problème récupération de données avec un SELECT DISTINCT
    Par 12_darte_12 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2005, 15h48
  3. problème récupération valeur d'un "div"
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/06/2005, 11h04
  4. Problème de type chaîne
    Par champijulie dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 12/05/2005, 21h23
  5. [Débutant] Problème récupération de données
    Par flogreg dans le forum Servlets/JSP
    Réponses: 26
    Dernier message: 20/08/2004, 18h29

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