Forum Programmation.shell Salut

Posté par  .
Étiquettes : aucune
0
13
mar.
2005
je suis étudiant, et j'ai un petit shell à faire, mais je ne m'en sors pas du tout alors je cherche un peu d'aide.

Je dois écrire un programme qui liste l'ensemble des fichiers pour un utilisateur dont le nom est donné en paramètre sur la ligne de commande.

J'espère que quelqu'un pourra m'aider, merci par avance...
  • # RTFM

    Posté par  (site web personnel) . Évalué à 6.

    #!/bin/sh
    find / -user $1
  • # quelques pistes

    Posté par  (site web personnel) . Évalué à 1.

    pour rappel, les arguments de la ligne de commande sont accessibles par $1 ... $9 dans le corps du script.

    je ne sais pas ce que tu entends par l'ensemble des fichiers pour un utilisateur, mais il y a des chances que ça fasse intervenir un ls ou un find (voir les pages de man pour les détails), et probablement un grep pour le filtrage, voire même un cut à la fin si besoin de changer le formatage de la sortie. Ces éléments seront vraisemblablement reliés par un pipe (|) à moins que tu ne passes par des fichiers temporaires (moins élégant mais peut-être plus simple à décomposer).

    Voilà, en espérant que ça t'aide à te débloquer.
    • [^] # Re: quelques pistes

      Posté par  . Évalué à 1.

      il y a un serveur ou on se log avec un nom d'utilisateur.
      le prog que je veux faire sert à lister l'ensemble des fichiers situé sur l'espace disque spécifique à un utilisateur dont on rentre le nom en paramère.

      est-ce plus clair ?

      en tous cas, merci pour les réponses..
  • # MAN

    Posté par  (site web personnel) . Évalué à 1.

    MAN est ton ami
    exemples :
    man ls
    man grep
    man woman
    man man
    man find
    man bash
    man sh
    man info

    MAN peut aussi etre remplacé par INFO ou encore GOOGLE

    Ce genre de script relevant de la base de la programmation shell doit se trouver a peut pres dans n'importe quel bouquin (GOOGLE + OREILLY) ou sur n'importe quel site web (GOOGLE + SHELL SCRIPTING). Tout ceci necessite quand meme l'utilisation d'un CERVEAU et la je suis désolé il n'y a pas de manuel autre que descriptif.

    Au passage LinuxFR n'est pas un site de resolution de TP.
    • [^] # Re: MAN

      Posté par  . Évalué à 1.

      déjà, et d'une, ce n'est pas pour résoudre un TP, c'est parce que c'est moi qui doit gérer un script pour le seveur.

      de deux, j'ai un cerveau, et si ça ne faisait pas 2 semaines que je bosse dessus, je n'aurais rien demandé.

      de trois, je pensais que si je demandais un peu d'aide, on m'en apporterait sans me critiquer, et bien dorénavant, j'en chercherrai ailleurs.

      pour finir, tout le monde n'est pas un pro de la prog, je débute, j'y pige que dalle, j'ai dépensé en une semaine 150¤ dans des bouquins de merde qui ne m'apporte rien de plus et je galère comme un rat, alors tes commentaires pourris tu peux te les mettre là où je pense...

      sur ce, merci aux personnes qui m'ont répondues sans commentaires désagréables..
      • [^] # Re: MAN

        Posté par  . Évalué à 1.

        > et bien dorénavant, j'en chercherrai ailleurs.

        je ne te dit pas "à bientôt" :-)
      • [^] # Re: MAN

        Posté par  (site web personnel) . Évalué à 3.

        je suis étudiant, et j'ai un petit shell à faire

        Ca fait quand même vachement TP a rendre je trouve.

        j'ai dépensé en une semaine 150¤ dans des bouquins

        Dire que les caricatures pretendent que les etudiants sont pauvres... Et la BU elle sert a rien?

        si ça ne faisait pas 2 semaines que je bosse dessus

        Et t'en est ou après 2 semaines dessus? Parce que plutot que de donner la soluce je prefere te dire ou tu a faut et par ou chercher.

        alors tes commentaires pourris tu peux te les mettre là où je pense...
        J'veux bien me les mettre la ou tu pense, mais cela ne changera rien au fait que MAN, INFO, GOOGLE et la BU seront tes meilleurs source d'info et que ls, grep et find risquent fortement de te servir pour ton script. Sans compter qu'apres verification les resultats de GOOGLE sur SHELL SCRIPTING [1] m'on l'air d'etre de bons points de depart pour apprendre le shell.

        [1]http://www.google.fr/search?q=SHELL+SCRIPTING&start=0&start(...)
      • [^] # Re: MAN

        Posté par  (site web personnel) . Évalué à 2.

        Tient et puis tant que tu y es je te conseil de lire ce qui suit, ca te fera pas de mal :)
        http://www.linux-france.org/article/these/smart-questions/smart-que(...)
        • [^] # Re: MAN

          Posté par  . Évalué à 2.

          Bon je reconnais que je me suis un peu beaucoup emporté et j'en suis vraiment désolé.
          Je vais te placer le contexte.
          J'ai commencé le développement unix il y a à peu près 1 mois, à raison de 2/3h par semaine.
          Je n'ai pas encore approché une machine pour me faire les doigt, mon prof ne veut pas qu'on y touche.
          Il m'a demandé de faire un shell script pour le réseu de mon école où on défini un nom de groupe, et grâce à ce nom de groupe, on liste les utilisateurs appartenant à ce groupe puis les fichiers sur l'espace disque de chaque utilisateur.
          N'ayant pas beaucoup de connaissance du langage unix, j'ai commencé à chercher des scripts sur des pages françaises pour comprendre comment ça marche.
          Puis vu que ce que je dois faire ne ressemblait à rien de ce que je trouvais, j'ai cherché sur les pages englophones. J'ai trouvé pas mal de choses interressantes, mais je n'arrive pas du tout à organiser tout ça pour faire un script convenable.
          Alors du coup, j'ai trouvé ce site où j'ai posté un petit message pour qu'on m'aide à faire ça.
          Mais je veux pas un programme tout fait que je rebalancerai en disant "c'est moi qui l'ai fait"
          Je veux un programme qui marche où je peux comprendre pourquoi il marche et comment il marche. Je veux comprendre pourquoi on fait ci ou ça, comment on fait pour faire ça, etc...
          J'ai acheté des bouquins mais les exemples dedans ne sont pas ludiques.

          En fait, je n'y comprend pas grand chose et je cherche juste un peu d'explications...

          voilà, je suis vraiment désolé pour mes paroles grossières...
          • [^] # Re: MAN

            Posté par  (site web personnel) . Évalué à 2.

            Bon, je te préviens tout de suite, je suis loin d'être un gourou (jamais eu de cours d'info, je suis sous GNU/Linux depuis à peine 1 an).

            Je suis plutôt d'accord avec les réflexions de Calim' Héros (du genre "donne un poisson à un homme, tu le nourris un jour, apprends-lui à pêcher, tu le nourris toute sa vie), mais, sans vouloir te vexer, tu n'as pas l'air de vouloir apprendre à pêcher, et je n'aime pas voir quelqu'un qui a faim, et je n'ai pas envie que ce fil s'éternise.

            Résumons ce que j'ai compris de ton problème: on donne en argument le nom d'un groupe (audio par exemple), et tu veux que ton script sorte la liste des fichiers appartenant à chacun des utilisateurs de ce groupe.

            Je suppose que ce script est utilisé en root (sinon, je ne vois vraiment pas quoi faire).
            Premièrement, comment connaître les utilisateurs de audio? Le plus simple est d'aller directement voir dans /etc/group par
            #grep audio /etc/group
            audio:x:100:user1,user2,user3

            Ensuite, on ne veut conserver que les users, avec si possible des retours à la ligne à la place des virgules.
            J'avais commencé par le faire avec grep puis cut puis sed
            #grep audio /etc/group | cut -d : -f 4 | sed 's/,/\n/g'
            Puis en lisant l'aide de sed (et surtout http://sed.sourceforge.net/grabbag/tutorials/oneliners.txt(...) , référencé dans la page de manuel de sed), j'ai vu qu'il y avait plus élégant:

            #sed -e '/audio/!d;s///;s/:x:[0-9]*://;s/,/\n/g' /etc/group


            Maintenant qu'on a la liste des utilisateurs, on en fait quoi?
            Sachant (car tu as lu le man de find, ou simplement le premier post), que `find / -user nomdeluser` te donne la liste des fichiers de nomdeluser, il ne reste plus qu'à faire une boucle for:

            #for i in `sed -e '/audio/!d;s///;s/:x:[0-9]*://;s/,/\n/g' /etc/group` ; do find / -user $i > /tmp/fichiers.$i ; done


            Et voilà, tu as dans des fichiers séparé (/tmp/fichiers.user1 ...) la liste des fichiers de chaque utilisateur du groupe audio.
            Ceci n'est même pas un script, ce n'est qu'une ligne de commande.

            Pour ton information (je sais, je me répète), je ne suis pas informaticien de profession ni de formation, et je ne savais pas du tout comment faire cela avant d'avoir lu ton message. D'après les information des posts précédents, tu aurais pu le faire aussi.

            Il suffit d'un peut de curiosité (ce que Calim' Héros appelle un cerveau, sans doute), et de lire les pages de manuels de sed et find (si tu es étudiant en info, je présume que tu sais quand même ce qu'est une boucle for).
            Si tu n'as pas cette curiosité, je pense que tu ferais mieux de changer d'orientation.

            Cordialement
            • [^] # Re: MAN

              Posté par  . Évalué à 1.

              merci beaucoup pour toutes ces explications.

              J'ai compris les différentes étapes de ce que tu as fait. Mon problème principal était que je ne comprenais pas trop comment organiser tout ça pour que ça fonctionne. Ce que tu as fait m'éclaire un peu et je t'en remercie.

              J'ai une question tout de même. J'avais pensé faire intervenir un ls pour lister les fichiers du répertoire correspondant à un utilisateur du groupe , mais en pratique, je n'arrive pas à le faire. Je n'arrive pas à faire passer un ls dans le répertoire de l'utilisateur selectionné pendant une itération du for. Comment pourrais-je faire ceci ? Peut-on attribuer un numéro à chaque utilisateur du groupe pour ensuite faire les itérations ?

              merci...
              • [^] # Re: MAN

                Posté par  (site web personnel) . Évalué à 1.

                Dans la boucle for, $i est le nom de l'utilisateur, donc ls /home/$i va t'afficher le contenu du répertoire de l'utilisateur $i

                Si tu veux numéroter les utilisateurs, rien ne t'empêche de créer un tableau nom[i] (je ne savais pas que bash pouvait le faire, mais la page de manuel de bash l'explique très bien dans la section "Tableaux"):
                #!/bin/sh
                j=0
                for i in `sed -e '/audio/!d;s///;s/:x:[0-9]*://;s/,/\n/g' /etc/group`
                do
                nom[j]=$i
                ls /home/${nom[j]}
                j=$((j+1))
                done

                C'est assez gruik et inutile, mais si ça peut te faire plaisir...

                Je me demande:
                1) si tu as vraiment compris la ligne que je t'avais donnée
                2) si tu sais ce que tu veux faire

                Au moins, il y en aura un de nous deux qui aura appris quelquechose aujourd'hui...
                • [^] # Re: MAN

                  Posté par  . Évalué à 1.

                  sed -e '/audio/!d;s///;s/:x:[0-9]*://;s/,/\n/g' /etc/group

                  je pense avoir compris la syntaxe, mais je ne suis pas sûr.

                  la commande sed sert à faire des opérations sur un fichier puis afficher le résultat sur la sortie standard.

                  le paramètre -e indique qu'on va faire plusieurs commandes

                  par contre, pour ça, je suis un peu plus embêté :

                  /audio/!d;s///;s/:x:[0-9]*://;s/,/\n/g

                  Si ça ne te dérange pas trop, est-ce que tu pourrais m'expliquer à quoi correspond chaque paramètre ? J'ai regardé sur le site de sourceforge, mais je comprend pas trop comment tu as fait ça.

                  merci
                  • [^] # Re: MAN

                    Posté par  (site web personnel) . Évalué à 1.

                    Avant tout, tu sais que chaque ligne du fichier /etc/group est de la forme
                    nom du groupe:x:GID:user1,user2
                    Je présume que le "x" signifie qu'il n'y a pas de mot de passe pour le groupe, ou qu'il est géré pas shadow.

                    Comme précisé dans mon premier message, la commande sed en question est équivalente à
                    #grep audio /etc/group | cut -d : -f 4 | sed 's/,/\n/g'

                    /audio/!d va chercher la ligne (on suppose qu'il n'y en a qu'une) qui contient audio, et ne conserver qu'elle (c'est l'équivalent d'un "grep audio", comme expliqué dans le lien fourni dans mon premier message)

                    s/// va supprimer le mot audio (comme expliqué dans le lien fourni dans mon premier message)

                    s/:x:[0-9]*:// va supprimer tout ce qui est de la forme :x:des chiffres:

                    Ces deux derniers sont donc l'équivalent du "cut"

                    enfin, s/,/\n/g va remplacer les virgules par des retours à la ligne (\n).

                    Pour savoir comment j'ai fait, bah... j'ai tatonné, essayé des trucs, puis d'autres, jusqu'à ce que ça marche. AMHA c'est comme ça qu'on apprend.
                    • [^] # Re: MAN

                      Posté par  . Évalué à 1.

                      ok merci beaucoup, c'est vraiment très gentil de m'avoir expliqué tout ça...

                      est-ce que tu pourrais me donner de bonnes références pour pouvoir apprendre l'essentiel de la programmtion sous unix ? (livres, sites, etc...)

                      merci
                      • [^] # Re: MAN

                        Posté par  (site web personnel) . Évalué à 1.

                        Personnellement, j'ai surtout appris en regardant les scripts de ma Mandrake et de ma Gentoo... ils sont la plupart du temps bien commenté.
                        Les astuces de DLFP sont aussi très instructives, ainsi que tous les forums (lire des réponses à des questions que tu ne te poses pas apporte beaucoup).
                        Sinon, les grands classiques qui t'ont déjà été suggérés: les premiers résultats d'une recherche "shell scripting" sur Google, léa, les pages de manuel de bash, ls, sed, find, grep, awk, cut, tail, head, man, woman, c, re_syntax
                        • [^] # Re: MAN

                          Posté par  . Évalué à 1.

                          ok merci bien, je vais travailler avec ça pour apprendre..

                          merci beaucoup pour ton aide..
                        • [^] # Re: MAN

                          Posté par  . Évalué à 1.

                          Jai tout de même une dernière question. Ou plutôt savoir si ce que je fais est juste.

                          Dans ton exemple, le groupe "audio" est un groupe que tu prends pour exemple.
                          Dans ce que je veux faire, le nom du groupe est sur la ligne de commande, en paramètre. Donc on l'aura en faisant un $1 (enfin je pense).
                          Mais alors, comment peut-on faire la différence entre $1 quand on prend le paramètre et $1 quand on fait le for et que i=1 ?

                          est-ce juste d'écrire ça si on enregistre la ligne dans un programme et qu'on le lance avec le nom du groupe en paramètre :

                          #for i in `sed -e '/$1/!d;s///;s/:x:[0-9]*://;s/,/\n/g' /etc/group` ; do find / -user $i > /tmp/fichiers.$i ; done


                          ???

                          merci
                          • [^] # Re: MAN

                            Posté par  (site web personnel) . Évalué à 1.

                            Première réponse: essaie, et tu verras bien!

                            Deuxième réponse: Bash est à peu près logique, et pour lui, i est une lettre (la 9ème de l'alphabet) et 1 est un chiffre (le deuxième). Il n'y a donc aucune chance que 1=i. En revanche, la variable $i peut valoir 1. En appliquant ton raisonnement, si le premier utilisateur s'appelle paflechien, la ligne deviendrait
                            fpaflechiennd / -user $paflechien > /tmp/fpaflechienchpaflechieners.$paflechien

                            Troisième réponse: la question ne se pose même pas, puisque bash effectue d'abord le sed blabla, puis attribue successivement à $i toutes les valeurs sortie par sed blabla.

                            Avant que tu ne me poses la question: je sais, ça ne marche plus si tu remplace audio par $1: Tu dois alors remplacer les apostrophes par des guillemets doubles. Pour savoir pourquoi, cherche "protection" dans le manuel de bash.
                            • [^] # Re: MAN

                              Posté par  . Évalué à 1.

                              ok merci beaucoup.
                              la prochaine fois que je me lance dans l'écriture d'un script, j'essayerai d'avoir un pc avec unix à portée de main, c'est vraiment pas facile de faire sans !!! lol
                              • [^] # Re: MAN

                                Posté par  (site web personnel) . Évalué à 1.

                                Les liveCD sont (aussi) faits pour ça. Et toutes le pages de manuel sont accessible sur le Grand Ternette.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.