Vous êtes sur la page 1sur 5

TP système d’exploitation

TP1 – utilisation du shell pour faire des scripts - corrigé

Sujet écrit par Stanislas Oger (stanislas.oger@univ-avignon.fr)

1. Introduction

La correction de chaque exercice est un script bash. Il s'agit en fait d'un fichier contenant des commandes bash et possédant un shebang (la première ligne du fichier qui contient #!/chemin/vers/le/shell) indiquant que c'est avec bash qu'il faut l'executer.

Pour exécuter un tel script il faut utiliser le shell pour lequel il a été écrit, ici bash. Par exemple pour un script dont le nom est exo1.sh, il faut entrer la commande suivante :

$ bash exo1.sh

Note : le caractère '$' en début de ligne n'est pas à entrer au clavier, il s'agit du symbole qui indique que vous êtes dans un shell utilisateur. Le shell root (superutilisateur) possède par convention le caractère '#'.

Je vous conseille pour réviser de décomposer ces exercices commande par commande et de les essayer dans un terminal. Vous comprendrez ainsi par l'exemple le fonctionnement de ces commandes.

Note : en script bash les espaces sont très importants. Par exemple si j'écrivais « if[a==2] » j'aurai une erreur. Il faut des espaces partout : « if [ a == 2 ] ». Note : les caractères point virgule à la fin des lignes sont facultatifs. Je les met dans la correction car il est ainsi plus facile de voir la fin de chaque commande.

2. Correction

Exercice 1

Ecrire un script qui liste tous les utilisateurs du système avec pour chaque les groupes auquel il appartient.

#!/bin/bash

cat /etc/passwd | cut -d':' -f1 | while read utilisateur;

do

 

groupes=$(groups $utilisateur);

echo "$utilisateur appartient au(x) groupe(s) : $groupes";

done

Exercice 2

Ecrire un script, qui écrit dans un fichier passé en argument, tous les groupes du système qui ont au moins un utilisateur.

#!/bin/bash

# on verifie qu'un argument ait bien été passé au programme, sinon on sort

if [ $# != 1 ] ; then

echo "Utilisation : $0 <fichier>";

exit 1;

fi

fichier=$1;

# on parcours le fichier de groupes ligne par ligne

cat /etc/group | while read ligne; do

# on deocupe la ligne pour récupérer le groupe et les utilisateurs

groupe=$(echo "$ligne" | cut -d':' -f1);

utilisateurs=$(echo "$ligne" | cut -d':' -f 4);

# si le champ utilisateurs n'est pas vide, c'est que le groupe en a !

if [ -n "$utilisateurs" ]; then

echo "Le groupe $groupe a au moins un utilisateur : $utilisateurs";

fi;

done > $fichier

# avec le '>' on redirige la sortie standard de la boucle vers le fichier

Exercice 3

Ecrire un script qui vérifie qu'aucun disque du système n'est plein a plus de 80%.

#!/bin/bash

# on lit la sortie de df ligne par ligne en decoupant les colonnes

df | grep -v '1K-blocks' | while read disque taille utilise dispo pourcent montage;

do

# on enleve le caractere '%' a la fin du champ indiquant le pourcentage

nombre_pourcent=$(echo $pourcent | cut -d '%' -f1);

if [ $nombre_pourcent -ge 80 ]; then

echo "Le disque $disque (montage $montage) est pris a $pourcent.";

done

fi;

Exercice 4

Ecrire un script qui liste toutes les personnes qui utilisent la commande gedit sur un fichier de votre répertoire home.

#!/bin/bash

home=/home/toto

lsof | grep $home | grep gedit | while read programme pid utilisateur rien rien rien rien rien fichier; do

echo "L'utilisateur $utilisateur édite le fichier $fichier";

done

Exercice 5

Ecrire un script qui vous indique depuis combien de temps un utilisateur donné en paramètre est connecté.

#!/bin/bash

# on verifie qu'un argument ait bien été passé au programme, sinon on sort

if [ $# != 1 ] ; then

echo "Utilisation : $0 <utilisateur>";

exit 1;

fi

utilisateur=$1;

# on ne garde que les lignes qui contiennent l'utilisateur cherché

# et on ne garde que la dernière de ces lignes (tail -n1)

who | grep $utilisateur | tail -n1 | while read user term date heure reste;

do

echo "$user est connecté depuis le $date à $heure.";

done

Exercice 6

Ecrire un script qui liste tous les utilisateur d'un groupe donné en paramètre qui sont connectés.

#!/bin/bash

# on verifie qu'un argument ait bien été passé au programme, sinon on sort

if [ $# != 1 ] ; then

echo "Utilisation : $0 <groupe>";

exit 1;

fi

groupe=$1;

# on parcours tous les utilisateurs connectés

who | while read utilisateur reste; do

# est_il_du_groupe contient le nombre de lignes retournées par id qui

# contiennent le groupe cherché. Si c'est 0, c'est que l'utilisateur

# n'appartient pas au groupe.

est_il_du_groupe=$(id $utilisateur | grep "($groupe)" | wc -l);

if [ $est_il_du_groupe -ne 0 ]; then echo "$utilisateur du groupe $groupe est connecté";

fi; done | sort -u

# le sort -u permet de n'afficher qu'une fois les lignes identiques, ce qui

# arrive si les utilisateurs sont connectés sur plusieurs terminaux

Exercice 7

Ecrire un script qui devra être lancé à chaque fois que vous vous connectez et qui sauvegardera un répertoire passé en paramètre dans le fichier ~/log/<AAAA-MM-JJ- HH:mm:SS>.tar.gz où <AAAA-MM-JJ-HH:mm:SS> est la date et l'heure actuelle.

#!/bin/bash

# on verifie qu'un argument ait bien été passé au programme, sinon on sort

if [ $# != 1 ] ; then echo "Utilisation : $0 <repertoire>"; exit 1;

fi

repertoire=$1;

# si le repertoire n'existe pas, on le créé

if [ ! -e ~/log ] ; then mkdir -p ~/log

fi

#

on stocke date dans le format demandé dans la variable $date

date=$(date +"%Y-%m-%d-%H:%M:%S")

# on compresse le repertoire $repertoire dans une archive ~/log/$date.tar.gz

tar cfz ~/log/$date.tar.gz $repertoire

Pour que le script soit lancé à chaque connexion vous devez ajouter une ligne dans le fichier ~/.bashrc. Par exemple :

bash exo7.sh ~/rep_a_sauvegarder

Exercice 8

Ecrire un script qui liste tous les fichiers se trouvant dans un répertoire passé en paramètre, qui sont exécutables et dont vous êtes le propriétaire.

#!/bin/bash

# on verifie qu'un argument ait bien été passé au programme, sinon on sort

if [ $# != 1 ] ; then echo "Utilisation : $0 <repertoire>"; exit 1;

fi

repertoire=$1;

# on trouve avec quel nom d'utilisateur on est connecté

mon_utilisateur=$(whoami)

# on effectue la recherche avec find. -type f permet de n'avoir que des

# fichiers parce que tous les repertoires sont en généram executables. Sur un

# répertoire le droit d'exécution indique qu'on peut lister son contenu.

find $repertoire -executable -user $mon_utilisateur -type f

Exercice 9

Ecrire un script qui devra être lancé à chaque fois que vous vous connectez et qui ajoute dans le fichier ~/log/historique.list la date au format <AAAA-MM-JJ-HH:mm:SS> suivi de toutes les commandes que vous avez lancé. <AAAA-MM-JJ-HH:mm:SS> est la date et l'heure actuelle.

#!/bin/bash

# si le repertoire n'existe pas, on le créé

if [ ! -e ~/log ] ; then

mkdir -p ~/log

fi

#

on ajoute la date dans le format demandé a la fin du fichier

date +"%Y-%m-%d-%H:%M:%S" >> ~/log/historique

# puis l'historique de nos commandes qui se trouve dans ~/.bash_history

cat ~/.bash_history >> ~/log/historique