You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
6.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

r# 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:
- Lindication que le shell utilisé doit être `bash`: `#!/bin/bash`
- La création et laffectation dune variable `annee` ;
- Laffichage 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 dexé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
<html>
<body>
<table border="1">
<tr><td>root</td><td>136</td></tr>
<tr><td>davalan</td><td>91</td></tr>
<tr><td>dansguardian</td><td>11</td></tr>
<tr><td>proxy</td><td>2</td></tr>
<tr><td>haldaemon</td><td>2</td></tr>
<tr><td>daemon</td><td>2</td></tr>
<tr><td>avahi</td><td>2</td></tr>
<tr><td>www-data</td><td>1</td></tr>
<tr><td>uml-net</td><td>1</td></tr>
<tr><td>statd</td><td>1</td></tr>
<tr><td>ntp</td><td>1</td></tr>
<tr><td>messagebus</td><td>1</td></tr>
<tr><td>Debian-exim</td><td>1</td></tr>
<tr><td>clamav</td><td>1</td></tr>
</table>
</body>
</html>
```
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 :
<html>
<body>
<table border="1">
<tr><td>root</td><td>136</td></tr>
<tr><td>davalan</td><td>91</td></tr>
<tr><td>dansguardian</td><td>11</td></tr>
<tr><td>proxy</td><td>2</td></tr>
<tr><td>haldaemon</td><td>2</td></tr>
<tr><td>daemon</td><td>2</td></tr>
<tr><td>avahi</td><td>2</td></tr>
<tr><td>www-data</td><td>1</td></tr>
<tr><td>uml-net</td><td>1</td></tr>
<tr><td>statd</td><td>1</td></tr>
<tr><td>ntp</td><td>1</td></tr>
<tr><td>messagebus</td><td>1</td></tr>
<tr><td>Debian-exim</td><td>1</td></tr>
<tr><td>clamav</td><td>1</td></tr>
</table>
</body>
Si vous avez besoin d'informations complémentaires sur html, vous pouvez allez voir [w3schools.com](https://www.w3schools.com/tags/default.asp).