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.

6.5 KiB

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.

#!/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>
<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>
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.