Exercice en shell
Résolu
yacine
-
makoko Messages postés 53 Date d'inscription Statut Membre Dernière intervention -
makoko Messages postés 53 Date d'inscription Statut Membre Dernière intervention -
l'exo en script bash consiste à lire à partir d'un argument $1 qui sera le fichier , et à en déduire les permissions du propriétaire du groupe et des autres (o)de telle sorte avec en sortie par exemple cette forme là :
read write execute
user moi oui oui oui
group le groupe oui non non
others les autres oui non non
je débute alors j'ai du mal , voici ce que j'ai fait pour la partie la plus importante du script
!#/bin/bash
i=2 ( i compteur )
while ($i -lt 9 ) ( on part de 2 car le 1 er caractere sera le type ex -rwxrw-r--)
if ( cut -c$i | ls -l $1 == [a-z]
echo"oui"
else
echo "non"
fi
i=i+1
done
merci pour votre aide
read write execute
user moi oui oui oui
group le groupe oui non non
others les autres oui non non
je débute alors j'ai du mal , voici ce que j'ai fait pour la partie la plus importante du script
!#/bin/bash
i=2 ( i compteur )
while ($i -lt 9 ) ( on part de 2 car le 1 er caractere sera le type ex -rwxrw-r--)
if ( cut -c$i | ls -l $1 == [a-z]
echo"oui"
else
echo "non"
fi
i=i+1
done
merci pour votre aide
A voir également:
- Exercice en shell
- Classic shell - Télécharger - Personnalisation
- Secure shell - Télécharger - Divers Web & Internet
- Shell startup windows 10 - Guide
- Shell infrastructure host c'est quoi - Guide
- Efi shell version 2.31 - Forum Programmation
48 réponses
Salut,
j'ai pas mal galérer avec le nom aussi mais au final je suis quand même parvenu a le faire afficher, par contre dans mon exercice je devais faire apparaitre le username sans le point entre le prénom et le nom.
Et voilà....
j'ai pas mal galérer avec le nom aussi mais au final je suis quand même parvenu a le faire afficher, par contre dans mon exercice je devais faire apparaitre le username sans le point entre le prénom et le nom.
finger -l | grep Name > temp echo " " > who_process who | cut -d" " -f1 | while read lines do grep $lines temp | cut -d":" -f3 >> who_process echo " " >> who_process ps -u $lines >> who_process echo " " >> who_process done rm temp | echo "List of user(s) and process running have been saved to the file who_process" exit
Et voilà....
salut tout le monde !
je reviens ver vous ...au sujet de mon problème de users et de process !
j'ai testé la solution de hug...astucieux! et ça marche ! même si, c'est moins économique, peut-être comme solution.
par contre, il y a une chose, que je ne comprends pas encore, même après l'avoir décortiqué et réalisé, pas à pas, pour comprendre.
explication : je veux toujours comprendre et jamais recopié sans comprendre et, cela peut prendre du temps, parfois, avec les 'fous furieux' et appréciables développeurs, que nous avons ici : lami et jipi , et peut-être rejoint bientôt par un troisième larron, mais moin 'fou', pour le moment!
Explication :
finger -l | grep Name > temp => liste un user connectés avec process, sans les headers, en cours et tu prends son login, nom, son rep, son shell, et autres, puis tu envois cela dans une commande grep, qui récupère le nom, ensuite tu sauvegardes dans un fichier , temp, non pas Name, seulement, mais name et login :ok => a
finger -l (moi, seulement à ce moment là)
Login: moi Name: Mom nom
Directory: /home/moi Shell: /bin/bash
On since Sat Feb 9 22:08 (GMT) on pts/1 from 83.204.133.98 # temp
No mail.
No Plan.
finger -l | grep Name
login: moi Name: mon nom
echo " " > who_process => création d'un fichier , who_process, dans lequel, tu crées, un espace vide vertical, quelques lignes, pour users connectés
who => moi pts/1 2008-02-09 22:08 (xx.xxx.xxx.xx) (moi, seulement, à ce moment là)
who | cut -d" " -f1 | while read lines => tu prends ces users connectés, et tu extrais, les infos : login, machine (pts) , puis tu lis les lignes tant que le code de retour n'est pas différent de zéro.
do
grep $lines temp | cut -d":" -f3 >> who_process => tu prends dans temp, le troisième champ : Name, que tu envois dans who_process, pour lequel, tu avais déjà créé la place (echo " ")
echo " " >> who_process => encore un espace vertical dans who_process ( quelques lignes)
ps -u $lines >> who_process => tu récupères les en-têtes
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1553 30318 0.0 0.0 4624 1520 pts/1 Ss 22:08 0:00 -bash
1553 30426 0.0 0.0 4220 940 pts/1 R+ 22:28 0:00 ps -u
echo " " >> who_process => encore un espace dans le fichier
done
rm temp | echo "List of user(s) and process running have been saved to the file who_process" => supprime le fichier temp et reste, bien echo "xxxxxxxxx" pas mal vu ! c'est le même principe qu'avec le mot à insérer au milieu du texte, moité du nbre de lignes.
exit
je récapitule :
1. crées deux fichier, dans le premier, temp, tu mets une partie de ce que tu cherches et dans l'autre un espace pour une info dans contenu dans le premier
2. tu dis par une boucle while read, de créer autant d'espace nécessaire (echo " "), qu'il y aura de connectés à inséser
3. tu récupères les en-têtes, que tu cherches aussi à insérer (ps -u) et tu demandes toujours dans la boucle de créer autant d'espace nécessaire pour les recevoir
4. tu détruis le fichier temp (logique) et tu informes l'utilisateur sur le lieu de la consultation. En effet, sinon, c'est inquiétant !
Question : comment tu fais dans le 3., pour virer les autres en-têtes, que tu ne souhaites ! ( je n'ai pas encore compris, car j'ai vérifié pas à pas, mais en vain, pour le moment)
jipi :
ton script pour le nom (Name) est bon : impec !
problème du jour :
Ecrire un programme shell 4arg qui vérifie que le nombre d'arguments passés lors de l’appel du programme est égal à 4 et écrit suivant le cas le message “Correct” ou le message “Erreur"
travail effectué : j'ai du mal avec les boucles !
shopt -s extglob
case $1 in
+(:digit=4: ) echo " correct" # il ne prend pas les crochets!
comment écrire l'autre cas! je n'ai encore trouvé la solution encore!
;;
esac
merci
a+
je reviens ver vous ...au sujet de mon problème de users et de process !
j'ai testé la solution de hug...astucieux! et ça marche ! même si, c'est moins économique, peut-être comme solution.
par contre, il y a une chose, que je ne comprends pas encore, même après l'avoir décortiqué et réalisé, pas à pas, pour comprendre.
explication : je veux toujours comprendre et jamais recopié sans comprendre et, cela peut prendre du temps, parfois, avec les 'fous furieux' et appréciables développeurs, que nous avons ici : lami et jipi , et peut-être rejoint bientôt par un troisième larron, mais moin 'fou', pour le moment!
Explication :
finger -l | grep Name > temp => liste un user connectés avec process, sans les headers, en cours et tu prends son login, nom, son rep, son shell, et autres, puis tu envois cela dans une commande grep, qui récupère le nom, ensuite tu sauvegardes dans un fichier , temp, non pas Name, seulement, mais name et login :ok => a
finger -l (moi, seulement à ce moment là)
Login: moi Name: Mom nom
Directory: /home/moi Shell: /bin/bash
On since Sat Feb 9 22:08 (GMT) on pts/1 from 83.204.133.98 # temp
No mail.
No Plan.
finger -l | grep Name
login: moi Name: mon nom
echo " " > who_process => création d'un fichier , who_process, dans lequel, tu crées, un espace vide vertical, quelques lignes, pour users connectés
who => moi pts/1 2008-02-09 22:08 (xx.xxx.xxx.xx) (moi, seulement, à ce moment là)
who | cut -d" " -f1 | while read lines => tu prends ces users connectés, et tu extrais, les infos : login, machine (pts) , puis tu lis les lignes tant que le code de retour n'est pas différent de zéro.
do
grep $lines temp | cut -d":" -f3 >> who_process => tu prends dans temp, le troisième champ : Name, que tu envois dans who_process, pour lequel, tu avais déjà créé la place (echo " ")
echo " " >> who_process => encore un espace vertical dans who_process ( quelques lignes)
ps -u $lines >> who_process => tu récupères les en-têtes
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1553 30318 0.0 0.0 4624 1520 pts/1 Ss 22:08 0:00 -bash
1553 30426 0.0 0.0 4220 940 pts/1 R+ 22:28 0:00 ps -u
echo " " >> who_process => encore un espace dans le fichier
done
rm temp | echo "List of user(s) and process running have been saved to the file who_process" => supprime le fichier temp et reste, bien echo "xxxxxxxxx" pas mal vu ! c'est le même principe qu'avec le mot à insérer au milieu du texte, moité du nbre de lignes.
exit
je récapitule :
1. crées deux fichier, dans le premier, temp, tu mets une partie de ce que tu cherches et dans l'autre un espace pour une info dans contenu dans le premier
2. tu dis par une boucle while read, de créer autant d'espace nécessaire (echo " "), qu'il y aura de connectés à inséser
3. tu récupères les en-têtes, que tu cherches aussi à insérer (ps -u) et tu demandes toujours dans la boucle de créer autant d'espace nécessaire pour les recevoir
4. tu détruis le fichier temp (logique) et tu informes l'utilisateur sur le lieu de la consultation. En effet, sinon, c'est inquiétant !
Question : comment tu fais dans le 3., pour virer les autres en-têtes, que tu ne souhaites ! ( je n'ai pas encore compris, car j'ai vérifié pas à pas, mais en vain, pour le moment)
jipi :
ton script pour le nom (Name) est bon : impec !
problème du jour :
Ecrire un programme shell 4arg qui vérifie que le nombre d'arguments passés lors de l’appel du programme est égal à 4 et écrit suivant le cas le message “Correct” ou le message “Erreur"
travail effectué : j'ai du mal avec les boucles !
shopt -s extglob
case $1 in
+(:digit=4: ) echo " correct" # il ne prend pas les crochets!
comment écrire l'autre cas! je n'ai encore trouvé la solution encore!
;;
esac
merci
a+
par contre, jipi, il marche en mode script seulement, ton script de Nom, pas en ligne de commande, alors, que ce ne sont que des commandes internes que tu utilises, je crois!
mystère ! mais peut-être pas tant que ça !
a+
mystère ! mais peut-être pas tant que ça !
a+
Re-
J'ai pas compris ton problème là !? ;-\
problème du jour :
Ecrire un programme shell 4arg qui vérifie que le nombre d'arguments passés lors de l’appel du programme est égal à 4 et écrit suivant le cas le message “Correct” ou le message “Erreur"
Pas besoin de boucles ni de "case ... esac", une simple condition "if ... then ... else... fi" suffit :
J'ai pas compris ton problème là !? ;-\
$ NAME=$(finger -l | grep Name) $ echo ${NAME##*: } Jean-PhilippeÇa marche bien dans un terminal...
problème du jour :
Ecrire un programme shell 4arg qui vérifie que le nombre d'arguments passés lors de l’appel du programme est égal à 4 et écrit suivant le cas le message “Correct” ou le message “Erreur"
Pas besoin de boucles ni de "case ... esac", une simple condition "if ... then ... else... fi" suffit :
#! /bin/bash if [ "$#" != "4" ] then echo "Erreur" else echo "Correct" fi;-))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
salut tout le monde !
d'abord, merci pour lien de man, sur le net, ça aide et c'est plus pratique que de retourner, dans help, de bash.
lami, je reviens sur ton script :
for i in $(grep "$(who | cut -d' ' -f1)" /etc/passwd);do echo -e "$i\n" | cut -d':' -f5;ps -opid,tname,time,comm -U ${i%%:*};done
pour moi, il affiche, mon prénom deux fois, et les autres, toujours le prénom, une seule fois !
alors, le message d'erreur, affiche les bonnes options, à mettre : j'ai essayé avec quelques unes, toujours pas de résultat.
mais,il est intéressant, il m'a permis de poursuivre mes tests, de comprendre mieux : cut -opt, et d'oser des choses !
Hug,
désolé! pour ton bébé! je l'ai amoindri ...:) => résultat: j'ai exactement ce que je voulais ! (pid est aligné vers la droite, parfait! ce qui n'est pas visible sur la capture d'écran, mais lance-le, alors tu verras!)
----------------------------------------------------------------------------
#!/bin/bash
finger -l | grep Name > temp
echo > who_process
who | cut -d" " -f1 | while read lines
do
grep $lines temp | cut -d":" -f3 >> who_process
ps -u $lines >> who_process
echo >> who_process
done
rm temp | echo "List of user(s) and process running have been saved to the file who_process"
exit
-----------------------------------------------------------------------------
résultat :
Toi
PID TTY TIME CMD
12956 ? 00:00:04 sshd
12957 pts/3 00:00:00 bash
1109 pts/3 00:00:00 vim
Moi
PID TTY TIME CMD
29539 ? 00:00:00 sshd
29540 pts/5 00:00:00 bash
1135 pts/5 00:00:00 sh
1140 pts/5 00:00:00 sh
1149 pts/5 00:00:00 ps
salutations à jipi!
merci à tous !
a+
:)
ps : là, je vais déjeuner, ouf!
d'abord, merci pour lien de man, sur le net, ça aide et c'est plus pratique que de retourner, dans help, de bash.
lami, je reviens sur ton script :
for i in $(grep "$(who | cut -d' ' -f1)" /etc/passwd);do echo -e "$i\n" | cut -d':' -f5;ps -opid,tname,time,comm -U ${i%%:*};done
pour moi, il affiche, mon prénom deux fois, et les autres, toujours le prénom, une seule fois !
alors, le message d'erreur, affiche les bonnes options, à mettre : j'ai essayé avec quelques unes, toujours pas de résultat.
mais,il est intéressant, il m'a permis de poursuivre mes tests, de comprendre mieux : cut -opt, et d'oser des choses !
Hug,
désolé! pour ton bébé! je l'ai amoindri ...:) => résultat: j'ai exactement ce que je voulais ! (pid est aligné vers la droite, parfait! ce qui n'est pas visible sur la capture d'écran, mais lance-le, alors tu verras!)
----------------------------------------------------------------------------
#!/bin/bash
finger -l | grep Name > temp
echo > who_process
who | cut -d" " -f1 | while read lines
do
grep $lines temp | cut -d":" -f3 >> who_process
ps -u $lines >> who_process
echo >> who_process
done
rm temp | echo "List of user(s) and process running have been saved to the file who_process"
exit
-----------------------------------------------------------------------------
résultat :
Toi
PID TTY TIME CMD
12956 ? 00:00:04 sshd
12957 pts/3 00:00:00 bash
1109 pts/3 00:00:00 vim
Moi
PID TTY TIME CMD
29539 ? 00:00:00 sshd
29540 pts/5 00:00:00 bash
1135 pts/5 00:00:00 sh
1140 pts/5 00:00:00 sh
1149 pts/5 00:00:00 ps
salutations à jipi!
merci à tous !
a+
:)
ps : là, je vais déjeuner, ouf!
hi!
"Ça marche bien dans un terminal... "
certainement, et je te crois, preuve, à l'appui, mais je suis en mode asp!
je pense à installer un linux, avec VMWare, en local, même avec un live! Mais je ne l'ai pas encore fait !
sinon, merci pour le script : tu est trop fou! tu m'as encore grillé ! ça me donne du boulot, encore !
Problème du jour :
Ecrire un programme shell reconnaitre qui demande à l’utilisateur d’entrer un mot, puis suivant le première caractère de ce mot, indique s’il commence par un chiffre, une minuscule, une majuscule ou une autre sorte de caractère.
merci
a+:))
ps : dire que le prof a donné cet exo, un cours en ligne, après un cours sur : structure de contrôle : case et while!
"Ça marche bien dans un terminal... "
certainement, et je te crois, preuve, à l'appui, mais je suis en mode asp!
je pense à installer un linux, avec VMWare, en local, même avec un live! Mais je ne l'ai pas encore fait !
sinon, merci pour le script : tu est trop fou! tu m'as encore grillé ! ça me donne du boulot, encore !
Problème du jour :
Ecrire un programme shell reconnaitre qui demande à l’utilisateur d’entrer un mot, puis suivant le première caractère de ce mot, indique s’il commence par un chiffre, une minuscule, une majuscule ou une autre sorte de caractère.
merci
a+:))
ps : dire que le prof a donné cet exo, un cours en ligne, après un cours sur : structure de contrôle : case et while!
"désolé! pour ton bébé! je l'ai amoindri ...:) "
lol pas de souci, il était obèse de toute façon :)))) mais voilà un version encore plus light ( 1 ligne), malheureusement je passe toujours pas un fichier temporaire(temp) mais ça donne le même résultat, je vais voir après pour éviter l'utilisation d'un fichier.
je vais regarder pour ton autre exercice, ça doit pas être bien compliqué.
P.s.: si t'as besoin d'aide même a 3heure du mat, prend mon addresse msn, mon staut est hors ligne mais je suis tout le temps connecté.
anarcopunx_7@hotmail.com n'hésite pas même si il est très tard ( tôt... )
lol pas de souci, il était obèse de toute façon :)))) mais voilà un version encore plus light ( 1 ligne), malheureusement je passe toujours pas un fichier temporaire(temp) mais ça donne le même résultat, je vais voir après pour éviter l'utilisation d'un fichier.
#!/bin/bash finger -l | grep Name > temp ; who | cut -d" " -f1 | while read lines ; do grep $lines temp | cut -d":" -f3 ; ps -u $lines ; done ; rm temp
je vais regarder pour ton autre exercice, ça doit pas être bien compliqué.
P.s.: si t'as besoin d'aide même a 3heure du mat, prend mon addresse msn, mon staut est hors ligne mais je suis tout le temps connecté.
anarcopunx_7@hotmail.com n'hésite pas même si il est très tard ( tôt... )