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 :

Droit d'écriture et vérification repertoire


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Par défaut Droit d'écriture et vérification repertoire
    Bonjour, voilà j'ai un exo à réaliser ou l'on me demande de faire un script listant les repertoires ou l'user à le droit d'écriture.

    Je me suis mis dans le repertoire home, j'ai crée des dossiers ou j'ai donné des droits d'écritures à certains et pas à d'autres via le chmod ( j'ai bien vérifié en effectuant un ls -l les droits d'écriture de mes fichiers et repertoires ! )

    Voici mon script shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for rep in *
    do 
        if [ `test -d $rep && test -w $rep` ]
           then 
            echo "$rep C'est un répertoire accessible en écriture"
           else echo "$rep Ce n'est pas un répertoire ou il n'est pas accessible en ecriture "
           fi
    done
    On parcourt tous les répertoires dans notre répertoire courant ( ici home).
    Je teste Si c'est bien un répertoire et Si il est bien accessible en écriture !
    Dans tous les cas, il rentre dans le Then et me retourne "$rep Ce n'est pas un répertoire ou il n'est pas accessible en écriture ".

    L'algorithme me parait pourtant bon, je ne parviens pas à comprendre pourquoi il rentre systématiquement dans mon else !
    Merci d'avance pour votre aide!

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Il ne faut ni les `` ni les [] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if test -d $rep && test -w $rep
    then
        ...
    else
        ...
    fi
    Cela dit il y a plus simple avec find :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type d -perm -u+w

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Par défaut
    Super merci ca marche

    Cependant, je ne comprends pas comment était interprétée ma syntaxe précédente avec les crochets et les ` ` ! Pourrais tu m'expliquer la différence entre l'interprétation de ta syntaxe et la mienne?


    Je n'ai pas le droit d'utiliser la commande file malheureusement dans mon script ! Bien que en effet, c'est beaucoup plus rapide de rechercher dans tous les répertoires accessibles par l'user en écriture plutôt que de faire un boucle et une conditionnel au milieu...

    On me demande maintenant d'appliquer ceci aux sous-répertoires ( sans la commande find ...)
    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
    for rep in *
    do 
        if test -d $rep && test -w $rep 
           then 
            echo "$rep est un repertoire accessible en ecriture"
            cd $rep
            for rep2 in * 
            do
                if test -d $rep2 && test -w $rep2
                    then 
                    echo "  -$rep2 est un sous-repertoire accessible en ecriture"
                    else
                    echo "  -$rep2 n'est pas un sous-repertoire accessible en ecriture"
                fi
            done
            cd ..
            else
            echo "$rep n'est pas un repertoire accessible en ecriture"
        fi
    done
    Ça marche nickel, seul léger soucis, j'ai une erreur qui s'affiche:

    Desktop est un répertoire accessible en écriture
    ./exo3: line 9: test: too many arguments
    -CL�� la fare n'est pas un sous-répertoire accessible en écriture
    ./exo3: line 9: test: too many arguments
    -CL�� la fare~ n'est pas un sous-répertoire accessible en écriture
    -Prog n'est pas un sous-répertoire accessible en écriture
    ./exo3: line 9: test: Systeme: binary operator expected
    -Systeme Exploit n'est pas un sous-répertoire accessible en écriture
    ./exo3: line 9: test: david: binary operator expected
    -david super_matrice n'est pas un sous-répertoire accessible en écriture
    Quand il tombe sur des répertoires qui n'ont pas les droits d'écriture, il me retourne cette erreur :
    ./exo3: line 9: test: david: binary operator expected

    Ça rentre bien dans la bonne condition, mais je ne comprends pas vraiment cet erreur ligne 9 due à priori à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test -d $rep2 && test -w $rep2

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Les back-ticks (``) sont remplacés par la sortie (stdout) de la commande qui se trouve à l'intérieur.

    [ chaine ] est vrai si et seulement si chaine n'est pas la chaine vide.

    Donc ton test signifiait "si la commande test -d $rep && test -w $rep affiche quelque chose sur stdout, alors...", ce qui est toujours faux.

    Pour le problème de sous-répertoire ta solution n'est pas bonne, puisque tu ne vas descendre que d'un niveau. Le plus simple c'est de faire un fonction récursive qui prend un répertoire en paramètre, et pour chaque sous-répertoire :

    - Affiche le nom du sous-répertoire s'il est accessible en écriture
    - Se ré-appèle avec le nom du sous-répertoire en paramètre

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Par défaut
    En effet je ne fouille que le 1er niveau de sous-répertoire ! Merci pour l'astuce de la fonction récursive, j'ai pondu ca qui me semble bon !

    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
    sous_repertoire(){
    echo "         $rep est le répertoire dans lequel on va:"
    cd $rep
    for rep in *
    do
        if test -d $rep && test -w $rep
            then echo "        -$rep est un sous-répertoire accessible en écriture"
            sous_repertoire $rep
            else echo " $rep Pas accessible ! " 
        fi
    done
    cd ..
    }
     
    for rep in *
    do 
        if test -d $rep && test -w $rep 
           then 
            echo "$rep est un répertoire accessible en écriture"
            (sous_repertoire $rep)
            else
            echo "$rep n'est pas un répertoire accessible en écriture"
        fi
    done

    Ce qui m'a le plus perturbé c'était le fait qu'après être aller fouiller dans tous les sous-répertoires, il fallait revenir à notre répertoire 'principal'. Et j'ai fini par trouver l'astuce du shell fils ou je ne sais plus quel nom qu'on avait vu en cours, qui va si j'ai tout suivi, exécuter ma fonction dans un autre shell ce qui me permet de conserver mon répertoire principal

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Attention tu dois aussi descendre dans les répertoires sur lesquels tu n'as pas le droit d'écriture, parce que ces répertoires pourraient eux-même contenir des répertoire sur lesquels tu as les droits d'écriture.

Discussions similaires

  1. [Apache] donner les droits d'écriture pour PHP
    Par Torpedox dans le forum Apache
    Réponses: 4
    Dernier message: 07/01/2006, 15h01
  2. Tester les droits en écriture sur une table en VBA ?
    Par yerome60 dans le forum Access
    Réponses: 2
    Dernier message: 19/12/2005, 21h43
  3. Réponses: 5
    Dernier message: 05/07/2005, 19h05
  4. Apache - Droits d'accès dans les répertoires
    Par rabobsky dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 22/03/2005, 22h54
  5. droits en écriture sur le réseau
    Par julien20vt dans le forum MFC
    Réponses: 4
    Dernier message: 25/03/2004, 11h29

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