Script unix fichier env

Résolu
kamax54 Messages postés 7 Date d'inscription   Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour, je dois faire un script mais je bloque car visiblement je n'ai pas assimilé toutes les notions requises. Pouvez-vous m'aider à le résoudre et me donner des indications concernant les notions utilisées.
L'énoncé est le suivant :

Lancer les commandes suivantes:
env >> xx
env >> xx
env >> xx
env >> xx
env >> xx

Vous avez à présent un fichier nommé XX avec le contenu de env redirigé 5 fois à l'intérieur

Créer un script nommé 'username' qui prendra 1 argument qui sera le fichier créé précédemment (XX).
Parcourez ce fichier et recherchez les occurences de l'utilisateur qui a exécuté le script.
Lorsque vous avez trouvé une occurence de cet utilisateur, prenez la ligne et apposez-la dans un fichier en affichant un numéro de ligne et une parenthèse en début de ligne.

Le fichier créé ressemblera à ceci :

1) PWD=/home/belkacem.berbache
2) USER=belkacem.berbache
3) MAIL=/var/spool/mail/belkacem.berbache
4) LOGNAME=belkacem.berbache
5) HOME=/home/belkacem.berbache
6) PWD=/home/belkacem.berbache
7) USER=belkacem.berbache
8) MAIL=/var/spool/mail/belkacem.berbache
9) LOGNAME=belkacem.berbache
10) HOME=/home/belkacem.berbache

Nota!L'utilisation d'un fichier temporaire n'est pas permis.
Configuration: Windows XP
Firefox 2.0.0.6

7 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    root@debian:~/algorithme_en_c# env >> XX
    root@debian:~/algorithme_en_c# env >> XX
    root@debian:~/algorithme_en_c# env >> XX
    root@debian:~/algorithme_en_c# env >> XX
    root@debian:~/algorithme_en_c# env >> XX
    root@debian:~/algorithme_en_c# cat username
    #!/bin/bash
    i=1
    for var in $(grep -E '^(PWD|USER|MAIL|LOGNAME|HOME)' $1)
    do
    echo "$i) $var"  >> resultat
    i=$((i+1))
    done
    root@debian:~/algorithme_en_c# sh username XX
    root@debian:~/algorithme_en_c# cat resultat
    1) USER=lami20j
    2) MAIL=/var/mail/lami20j
    3) PWD=/home/lami20j/algorithme_en_c
    4) HOME=/home/lami20j
    5) LOGNAME=lami20j
    6) USER=lami20j
    7) MAIL=/var/mail/lami20j
    8) PWD=/home/lami20j/algorithme_en_c
    9) HOME=/home/lami20j
    10) LOGNAME=lami20j
    11) USER=lami20j
    12) MAIL=/var/mail/lami20j
    13) PWD=/home/lami20j/algorithme_en_c
    14) HOME=/home/lami20j
    15) LOGNAME=lami20j
    16) USER=lami20j
    17) MAIL=/var/mail/lami20j
    18) PWD=/home/lami20j/algorithme_en_c
    19) HOME=/home/lami20j
    20) LOGNAME=lami20j
    21) USER=lami20j
    22) MAIL=/var/mail/lami20j
    23) PWD=/home/lami20j/algorithme_en_c
    24) HOME=/home/lami20j
    25) LOGNAME=lami20j
    si l'option -E n'existe pas pour ton grep mets
    '^\(PWD\|USER\|MAIL\|LOGNAME\|HOME\)' 
    0
  2. kamax54 Messages postés 7 Date d'inscription   Statut Membre
     
    merci beaucoup lami20j !!! c'est exactement ça lol
    Pourrez-tu juste m'argumenter ta boucle, en particulier $(grep -E '^(PWD|USER|MAIL|LOGNAME|HOME)' $1) STP?Merci
    Pourquoi le ^ et pourquoi le -E ?
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    pour capturer le résultat d'une commande on utilise la syntaxe
    $(commande)

    discutons maintenant la commande

    j'utilise l'option -E qui fait que grep se comporte comme egrep (grep étendu)
    pourquoi?

    pour ne pas obliger de mettre un antislash avant chaque paranthèse et | (en bref, histoire de paresse :-))
    et aussi de compatibilité si le grep sur ton système n'a pas l'option -E (ça depends toujours de la version utilisée) on peut utiliser
    $(grep '^\(PWD\|USER\|MAIL\|LOGNAME\|HOME\)'  $1)


    Pourquoi ^ ?

    ^ perment d'ancrer l'expression régulière au début de chaine
    Donc cherche les chaines qui commencent avec PWD ou USER ou .....
    Je l'utilise puisque sinon je vais capturer aussi OLDPWD
    Comme ^ cherche au début de chaine, il ne va pas reconnaître OLDPWD même si PWD existe dans la chaîne
    0
  4. kamax54 Messages postés 7 Date d'inscription   Statut Membre
     
    ok, je te remercie pour ton aide lami20j
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    euh attends. Ya un truc qui m'échappe là.
    tu peux avoir d'autres variables d'environnement avec le nom de l'utilisateur qui exécute, et par ailleurs tu peux exécuter en tant qu'utilisateur X dans l'environnement de Y, auquel cas ces variables là peuvent te renvoyer un résultat invalide.

    enfin bon, une alternative en awk

    #!/usr/bin/awk -f
    BEGIN { "whoami" | getline ope }
    $_ ~ ope { x++; print x ") " $_ >> "resultat" }
    
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      pour changer l'identité d'un utilisateur on peut utiliser su autre ou su - autre

      dans le 1er cas même si je suis connecté sous l'identité de autre l'utilisateur garde son environnement donc pas de problèmes
      dans le 2ème cas je suis connectè dans l'environnement de autre donc ce n'est plus l'utilisateur qui lance la commande mais autre dans son environnement donc pas de problèmes

      en revanche le problème reste discutable si j'exécute la commande de cette manière
      donc depuis utilisateur j'exécute
      su -c commande autre


      0
      1. Utilisateur anonyme > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        ben c'est là où je veux en venir. Normalement quand tu développes tu ne le fais pas en partant du principe que l'utilisateur se mettra dans les conditions idéales, mais au contraire qu'il se mettra dans la seule situation emmerdogène à laquelle tu n'avais pas pensé :)

        Si ton examinateur accepte que le script fonctionne dans des conditions définies par toi, ça marche. S'il veut que ça fonctionne dans toutes les situations, là ça coince.
        0
      2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > Utilisateur anonyme
         
        En ce cas on peut faire comme ça
        #!/bin/bash
        i=1
        for var in $(sed -n -e /$USER/p $1)
        do
        echo "$i) $var"  >> resultat
        i=$((i+1))
        done
        Parcourez ce fichier et recherchez les occurences de l'utilisateur qui a exécuté le script.

        j'ai été dérouté par la sortie qu'il voulait obtenir :-)

        Merci.
        0
  7. Utilisateur anonyme
     
    root: ~# su biche
    biche: /root$ whoami
    biche
    biche: /root$ echo $USER
    root
    biche: /root$ whoami
    biche
    biche: /root$ exit
    root: ~#
    


    il me semblait bien m'être déjà fait avoir par cette variable :)

    faut charger l'environnement
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    rien ne t'empêche de changer $USER avec whoami ou d'utiliser des conditions, etc

    #!/bin/bash
    i=1
    for var in $(sed -n -e /$(whoami)/p $1)
    do
    echo "$i) $var"  >> resultat
    i=$((i+1))
    done
    


    et voilà ce que donne ton exemple chez moi (je ne me suis pas faire avoir encore avec cette variable :-))
    debian:~# su lami20j
    lami20j@deb:/root$ whoami
    lami20j
    lami20j@deb:/root$ echo $USER
    lami20j
    lami20j@deb:/root$ whoami
    lami20j
    lami20j@deb:/root$ exit
    exit
    debian:~#
    
    --
    lami20j

    P.S. Je m'arrête ici puisque mon but ce n'est pas de rendre ce programme portable :-D, j'ai d'autre projets que je veux rendre portable ;-)))
    Bonne soirée
    0