diff --git a/Algo/tp/tp8/tp8.h b/Algo/tp/tp8/tp8.h index fa313ef..f9f584d 100755 --- a/Algo/tp/tp8/tp8.h +++ b/Algo/tp/tp8/tp8.h @@ -6,4 +6,5 @@ void extraction(void); void initialiser(char mot[], int n); void placer(char mot1[], char c, char mot2[]); void jeuPendu(void); -int compterLettres(char mot[]); \ No newline at end of file +int compterLettres(char mot[]); +void chargement(int tMot); \ No newline at end of file diff --git a/systeme/tp/tp7/evaluateur.sh b/systeme/tp/tp7/evaluateur.sh new file mode 100755 index 0000000..144629e --- /dev/null +++ b/systeme/tp/tp7/evaluateur.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +val='a' + +until [ "$val" = "q" ] ; do + echo -n "Donnez une commande ( pour quitter) : " + read "val" + if [ "$val" = "q" ]; then + exit 0 + fi + echo "$($val)" +done diff --git a/systeme/tp/tp7/menu1.sh b/systeme/tp/tp7/menu1.sh new file mode 100755 index 0000000..d6bcdb1 --- /dev/null +++ b/systeme/tp/tp7/menu1.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +val=0 + +while [ "$val" -ne "9" ] ; do + if [ "$val" = "1" ] ; then + echo "" + echo "$(date)" + elif [ "$val" = "2" ] ; then + echo "" + echo "Il y a $(who -a | wc -l) personnes connéctées sur ta session." + elif [ "$val" = "3" ] ; then #les "" et = permettent d'eviter les pb si l'utilisateur tape une chaine de carac + echo "" + echo "$(ps -elf)" + elif [ "$val" != "9" ]; then + echo "C'est quoi ce chiffre ??!! Je ne connais pas !!" >&2 + fi + +echo"" +echo "Menu général" +echo "******************************" +echo "" +echo "<1> Afficher la date (date)" +echo "<2> Afficher le nombre de personnes connéctées (who)" +echo "<3> Afficher la liste des processus (ps)" +echo "<9> Quitter" +echo "" +read val +done diff --git a/systeme/tp/tp7/tp_7.md b/systeme/tp/tp7/tp_7.md new file mode 100644 index 0000000..00408b0 --- /dev/null +++ b/systeme/tp/tp7/tp_7.md @@ -0,0 +1,70 @@ +# TP 7 - Scripts + +Pas de compte rendu dédié aux TP sur les scripts shell. Vos programmes +feront foi ! + + + +Quelques règles simples pour éviter les erreurs de syntaxe : + +* jamais d'espace autour d'une affectation (exemple : `a=3`) +* des espaces partout ailleurs (exemple `if` `test` `$a` + `=` `4;` `then...` ou `if` `[` `$a` `=` + `4` `]` `;` `then...` + +Pour observer les commandes exécutées, passez en mode trace en plaçant +la commande `set -x` en début de programme. + + + +#### 6 - La commande menu1 + +En utilisant la structure `while`, écrire un script qui : + +Tant que l'utilisateur n'a pas tapé 9 + +* affiche un menu +* demande à l'utilisateur de saisir une option du menu +* affiche à l'utilisateur le résultat de sa commande + +Exemple de ce qui doit s'afficher à l'écran : + +``` +Menu général +*************************************** + +<1> Afficher la date (date) + +<2> Afficher le nombre de personnes connectées (who) + +<3> Afficher la liste des processus (ps) + +<9> Quitter +``` + +#### 7 - La commande evaluateur + +En utilisant la structure *until...do...done*, écrire un script qui : + +* demande à un utilisateur de saisir une commande +* exécute la commande ou affiche un message d'erreur si la commande ne s'est pas correctement exécutée. +* répète cette opération tant que l'utilisateur le désire + +Indication : si vous disposez d'une variable contenant une ligne de +commandes il est possible de l'exécuter via la fonction interne au shell +`eval`. Le code de retour retourné par eval est le code de retour +retourné par la commande. Exemple : `c="ls -l | wc -l"` `eval $c` + +Voici un exemple de ce que votre programme doit afficher à l'écran : + +``` +Saisissez une commande, commande pour quitter. +> date +mar sep 30 21:20:45 CEST 2008 +Saisissez une commande, commande pour quitter. +> cd /toto +bash: cd: /toto: Aucun fichier ou répertoire de ce type +cette commande a généré une erreur !!!! +Saisissez une commande, commande pour quitter. +> q +``` diff --git a/systeme/tp/tp8/case.sh b/systeme/tp/tp8/case.sh new file mode 100755 index 0000000..8282f42 --- /dev/null +++ b/systeme/tp/tp8/case.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +while [ $# -ne 0 ]; do + case "$1" in + '-v') + echo 'Mode verbose' + shift + ;; + '-m'|'-M') + machine="$2" + shift 2 || sortie "Manque valeur" + ;; + *) sortie "Argument $1 inconnu" + ;; + esac +done diff --git a/systeme/tp/tp8/option.sh b/systeme/tp/tp8/option.sh new file mode 100755 index 0000000..e29bcbf --- /dev/null +++ b/systeme/tp/tp8/option.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +L= +while [ $# -ne 0 ]; do + case "$1" in + '-lang') + if [ "$2" = "fr" ]; then + date +%d/%m/%y + elif [ "$2" = "en" ] ; then + date +%m/%d/%y + + date ++dd/mm/yy + shift + ;; + '-fullYear') + date +Y + shift + ;; + *) + echo "Argument $1 inconnu" + shift + ;; + esac +done diff --git a/systeme/tp/tp8/tp_8.md b/systeme/tp/tp8/tp_8.md new file mode 100644 index 0000000..c6f5e89 --- /dev/null +++ b/systeme/tp/tp8/tp_8.md @@ -0,0 +1,219 @@ +# Système utilisateur – TP n°8 + +Pas de compte rendu dédié aux TP sur les scripts shell. Vos programmes feront foi \! + +## Variables et environnement d'exécution + + - Vérifiez si la variable `PATH` contient le répertoire courant. Sinon ajoutez-le. + - Créez et affectez une variable de "jour" (pour aujourd'hui). + - Créez, affectez et exportez une variable "mois". + - Créez un fichier `variables.sh ` avec `vi` contenant les lignes suivantes: + - L’indication que le shell utilisé doit être `bash`: `#!/bin/bash` + - La création et l’affectation d’une variable `annee` ; + - L’affichage des contenus des trois variables : `jour`, `mois` et `annee`. + - Fixez les droits `rw-` pour le fichier `variables.sh`. + +Exécutez les commandes suivantes et **commentez le résultat obtenu**. + + - Exécutez la commande `sh variables.sh`. + - Exécutez la commande `echo $mois, $annee`. + - Exécutez la commande `source variables.sh`. + - Exécutez la commande `echo $jour, $mois, $annee`. + - Supprimez la variable `annee`. + - Ajoutez le droit d’exécution pour le fichier `variables.sh`. + - Exécutez la commande `variables.sh`. + - Exécutez la commande `echo $jour, $mois, $annee`. + +## La commande option + +Écrire un programme capable d'afficher la date et l'heure suivant différents formats en fonction des options qui lui sont passées : + +L'option `-lang lang` permet de choisir un affichage *jj mm aa* lorsqu'elle vaut *fr* » ou un affichage *mm jj aa* si elle vaut *en*. + +L'option `-fullYear` force l'affichage de l'année sur 4 chiffres au lieu de deux. + +L'option `-addTime` permet d'ajouter l'heure à l'affichage. + +La commande retournera un message d'erreur et un code retour de 1 si la syntaxe des options est incorrecte. +0 sinon. + +### Note + +Pour éviter que votre programme ne soit une "usine à gaz", décomposez le en trois parties : + +- Associer une variable à la valeur par défaut de chacune des options. +- Traiter les arguments et modifier la valeur des variables. +- Effectuer le traitement en fonction de la valeur des variables. + +Remarque : il est possible de préciser un format d'affichage à la commande `date` (exemple : `date +%M:%S`) + +## La commande `waitfor` + +Le programme `waitfor -user ident` doit, en scrutant chaque seconde la liste des processus, détecter la connexion de l'utilisateur dont le login est indiqué par l'option `-user`. +Une fois détectée, le programme se termine avec un message d'information. + +## Exercice sur les fonctions + +Il est courant d'avoir à compter des d'objets d'un certain type (processus, fichiers, ...) et de produire un tableau synthétique de la forme : `objetDeType1 nombre1` `objetDeType2 nombre2` `...` Un exemple classique est de compter le nombre de processus pour chaque utilisateur du système. Exemple : + +``` +$ ./compteProcessus +avahi 2 +clamav 1 +daemon 2 +dansguardian 11 +davalan 87 +Debian-exim 1 +haldaemon 2 +messagebus 1 +ntp 1 +proxy 2 +root 136 +statd 1 +uml-net 1 +www-data 1 +``` + +Le résultat ci-dessus a été produit par le script suivant qu'il vous faudra compléter. + +```bash +#!/bin/bash + +doc() { + cat << EOF >&2 +Affiche le nombre de processus de chaque utilisateur possédant au moins +1 processus dans le système. + +usage : \`basename $0\` \[ -h \] + + -h : affiche cette aide. +EOF +} + +usage() { + doc + exit 1 +} + + +# 1. Compte le nombre de processus de l'utilisateur dont le login est passé en argument. +# 2. $1 : le login. +# 3. stdout : le nombre de processus de l'utilisateur. +processOneUser() { + # Les remarques indiquées dans la fonction processAllUsers + # s'appliquent également à cette fonction + + ### A COMPLETER (1 ligne) ### +} + +# 1. Affiche le tableau (non trié) du nombre de processus par utilisateur. +# 2. Pas d'argument. +# 3. stdout : le tableau. +processAllUsers() { + # traitement + # ---------- + # début + # L<-liste des utilisateurs possédant un processus en mémoire + # pour i élément de L faire + # n=nombre de processus de l'utilisateur i dans le système + # afficher "i n" + # fin pour + # fin + + # Remarques : + # 1. pour obtenir la liste des propriétaire des processus, utilisez la + # commande : ps h -eo user + # 2. Pour éliminer les doublons d'une liste filtrez la avec la commande : + # sort -u. + + ### A COMPLETER (5 lignes) ### +} + +# Début du traitement des arguments. +while [ $# -ne 0 ]; do + case $1 in + -h|--help) + doc + exit 0 + ;; + *) usage + ;; + esac + shift +done +# Fin du traitement des arguments. + +processAllUsers +``` + +* Complétez le script. +* Ajoutez un filtre permettant de trier les lignes affichées par ordre décroissant de nombre de processus (étudiez les différentes options de `sort`). Le résultat attendu sera de la forme : + +``` +root 137 +davalan 90 +dansguardian 11 +proxy 2 +haldaemon 2 +daemon 2 +avahi 2 +www-data 1 +uml-net 1 +statd 1 +sshd 1 +ntp 1 +messagebus 1 +Debian-exim 1 +clamav 1 +``` + +* Ajouter une fonction `toHtml` à vos scripts pour modifier la sortie afin de produire un document HTML contenant une table. Voici ci-dessous un exemple de résultat attendu se basant sur l'exemple 1.1 : + +```html + + + + + + + + + + + + + + + + + +
root136
davalan91
dansguardian11
proxy2
haldaemon2
daemon2
avahi2
www-data1
uml-net1
statd1
ntp1
messagebus1
Debian-exim1
clamav1
+ + +``` + + En enregistrant la sortie dans un fichier d'extension .html et +en ouvrant ce fichier dans un navigateur vous devrez observer le +résultat suivant : + + + + + + + + + + + + + + + + + + +
root136
davalan91
dansguardian11
proxy2
haldaemon2
daemon2
avahi2
www-data1
uml-net1
statd1
ntp1
messagebus1
Debian-exim1
clamav1
+ + +Si vous avez besoin d'informations complémentaires sur html, vous pouvez allez voir [w3schools.com](https://www.w3schools.com/tags/default.asp).