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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 869
    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 869
    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 869
    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 869
    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 869
    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 869
    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.

+ Répondre à la discussion
Cette discussion est résolue.

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