Vous êtes sur la page 1sur 5

TP systme dexploitation

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 possdant un shebang (la premire ligne du fichier qui contient #!/chemin/vers/le/shell) indiquant que c'est avec bash qu'il faut l'executer. Pour excuter 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 caractre '$' en dbut 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) possde par convention le caractre '#'.

Je vous conseille pour rviser de dcomposer 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 trs importants. Par exemple si j'crivais if[a==2] j'aurai une erreur. Il faut des espaces partout : if [ a == 2 ] . Note : les caractres 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 systme 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 systme qui ont au moins un utilisateur.

TP 1 (v1) - Systme dExploitation - correction

1/5

#!/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 rcuprer 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 vrifie qu'aucun disque du systme 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."; fi; done

Exercice 4
Ecrire un script qui liste toutes les personnes qui utilisent la commande gedit sur un fichier de votre rpertoire home. TP 1 (v1) - Systme dExploitation - correction 2/5

#!/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 paramtre 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 dernire 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 paramtre qui sont connects.
#!/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;

TP 1 (v1) - Systme dExploitation - correction

3/5

# on parcours tous les utilisateurs connects who | while read utilisateur reste; do # est_il_du_groupe contient le nombre de lignes retournes 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 connects sur plusieurs terminaux

Exercice 7
Ecrire un script qui devra tre lanc chaque fois que vous vous connectez et qui sauvegardera un rpertoire pass en paramtre dans le fichier ~/log/<AAAA-MM-JJHH: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 : TP 1 (v1) - Systme dExploitation - correction 4/5

bash exo7.sh ~/rep_a_sauvegarder

Exercice 8
Ecrire un script qui liste tous les fichiers se trouvant dans un rpertoire pass en paramtre, qui sont excutables et dont vous tes le propritaire.
#!/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 gnram executables. Sur un # rpertoire le droit d'excution 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

TP 1 (v1) - Systme dExploitation - correction

5/5

Vous aimerez peut-être aussi