TP Bash
L'environnement du bureau
Premières commandes
Cet exercice a pour but de vous familiariser avec les commandes les plus courantes du shell bash. Elles permettent essentiellement de manipuler les fichiers et les répertoires.
Lisez attentivement le mode d'emploi des commandes avant de les utiliser (commande : man).
echo et pwd
Une fois lancée votre session de travail, prenez connaissance du chemin d'accès à votre répertoire de travail initial grâce à la commande : echo $HOME. Vous pouvez aussi utiliser la commande pwd.
mkdir
Créez un répertoire $HOME/UE13 (respectez la casse) si ce n'est pas déjà fait. Dans ce répertoire, créez un sous-répertoire de nom Bash.
cd
Faites du répertoire Bash votre répertoire de travail. Vérifiez que vous êtes bien dans le répertoire Bash (commande pwd).
Création de fichier
En utilisant la commande
echoet la redirection (caractère >), créez un fichier de nom identite_numeroduposte (exemple :identite_u1-001-1, attention à l'underscore).
Pour le numéro de poste, il faut savoir que toutes les machines d'une salle de TP du bâtiment U1 ont pour identificateur : u1-salle-poste, par exemple pour la salle 001, les postes sont u1-001-1, u1-001-2, ..., u1-001-20.
Ce fichier doit contenir une seule ligne ayant le format suivant :
nom ; prenom ; groupe_de_tp ; date_de_naissance
Cette ligne doit contenir des renseignements vous concernant (la date de naissance doit se présenter sous la forme année, mois et jour sans espace).
Exemple :
Turing ; Alan ; 1A ; 19120623
chmod
Modifiez les protections des répertoires UE13 et Bash et du fichier identite pour que les autres étudiants de votre groupe de TP puissent lire votre fichier identite_xxx.
cp
Recopiez dans le répertoire Bash les fichiers identités des étudiants présents dans votre rangée. Pour cela, déplacez-vous et demandez-leur le nom de leur répertoire de travail initial (ou home directory).
cat
Dans le répertoire Bash, créez un fichier nos_identites constitué de la concaténation des fichiers identite précédents.
ls
Créez un fichier de nom liste_commandes dans votre répertoire initial ($HOME), contenant la liste de tous les fichiers du répertoire /usr/bin.
pr
Créez un fichier dans votre répertoire initial ($HOME), de nom a_imprimer contenant la liste précédente sur trois colonnes avec le titre "Liste des commandes de base".
ln
Créez un répertoire tmp sous Bash. Créez dans ce répertoire tmp un lien de nom liste avec le fichier liste_commandes. Effacez le fichier liste_commandes, que constatez-vous ?
tail
Affichez le nom du fichier le plus ancien de votre répertoire courant.
Le réseau
La commande ifconfig
Sur le réseau internet chaque machine est identifiée par une adresse de la forme x.y.z.t, c'est l'adresse IP (Internet Protocol). Tapez la commande /sbin/ifconfig et vous allez voir apparaitre quelque chose de la forme
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.9.186.142 netmask 255.255.248.0 broadcast 10.9.191.255
inet6 fe80::a6bb:6dff:fecf:345b prefixlen 64 scopeid 0x20<link>
ether a4:bb:6d:cf:34:5b txqueuelen 1000 (Ethernet)
RX packets 143605 bytes 111646618 (111.6 MB)
RX errors 0 dropped 571 overruns 0 frame 0
TX packets 130709 bytes 130895978 (130.8 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 16 memory 0x91200000-91220000
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Boucle locale)
RX packets 444 bytes 43192 (43.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 444 bytes 43192 (43.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Dans le bloc eth0 le champ inet contient l'adresse IP (plus précisément IPv4) de votre machine (inet6 étant l'adresse IPv6).
La commande host
identificateur.domaine.pays.
univ-tln et Ainsi le nom de la machine u1-001-12 estu1-001-12.univ-tln.fr
host adresse-ipQuel est le nom de la machine dont l'adresse est 10.2.92.177 ?
host permet aussi de retouver l'adresse IP d'une machine uniquement à partir de son nom.Comment faire ?
La commande ssh
Les machines étant reliées au réseau, il est possible à un utilisateur quelconque de se connecter sur une autre machine afin d'en utiliser les ressources à condition bien sûr que :
- la machine distante accepte les connexions extérieures,
- l'utilisateur possède un compte sur la machine distante (ce qui se traduit par un login et un mot de passe).
ssh dont la syntaxe est : ssh adresse-ip ou ssh nom_machine.Ssh signifie secure shell ce qui signifie que tous les échanges d'information entre votre poste et la machine distante sont chiffrés de façon à ce qu'ils soient inintelligibles si on les intercepte. La syntaxe d'utilisation de ssh est la suivante :ssh -l login nom_machine (ou adresse-ip)-l login n'est pas obligatoire, dans ce cas c'est votre login qui est utilisé sur la machine distante pour vous identifier. Dans tous les cas vous devrez fournir un mot de passe. Pour couper la connexion il suffit de taper logout.u1-001-1.univ-tln.fr, il suffit de taper ssh u1-001-1.univ-tln.fr ou ssh IP (quelle est l'adresse IP de u1-001-1 ?).The authenticity of host 'u1-001-1 (10.9.185.211)' can't be established.
RSA key fingerprint is 33:76:79:d7:cc:f1:e5:f5:97:9c:98:1b:93:1f:aa:9e.
Are you sure you want to continue connecting (yes/no)?
Ssh étant un protocole sécurisé, ce dernier vous informe que vous tentez de vous connecter à une machine qu'il ne connaı̂t pas et que cela comporte un risque. Répondez yes à la question si vous n'avez aucun doute sur l'origine de la machine sur laquelle vous vous connectez.Essayez de vous connecter sur la machine
www.univ-tln.fr. Que se passe-t-il ? Expliquez pourquoi cela ne fonctionne pas ? Recommencez alors sur la machine de votre voisin de droite le plus proche (et pour le dernier de la rangée, la machine de son voisin de gauche le plus proche).
u1-001-1 il suffit de taper ssh u1-001-1.La commande scp
scp login@nom_de_la_machine:chemin_source chemin_destinationou
scp login@adresse-ip:chemin_source chemin_destination.scp nom_machine, vous serez alors identifié sur la machine distante avec votre login local, vous devrez ensuite fournir votre mot de passe distant (ceci ne fonctionne donc que si votre login distant est identique à votre login local).Exécutez les étapes suivantes :
- Créez un fichier de nom
mysterecontenant des informations quelconques. - Copiez-le dans le répertoire /tmp.
- Choisissez un poste de la salle de TP et (télé)copiez grâce à la commande
scple fichiermystereprésent sur ce poste (il est dans le répertoire /tmp propre à ce poste). - Affichez dans la console le contenu du fichier ainsi téléchargé.
Configuration de Firefox pour l'accès au Web
Exécutez les étapes suivantes :
- Lancez Firefox en cliquant sur l'icône :

- Allez dans le menu
Edition, sous-menuParamètreset choisissezAccueil. Activez alors l'optionPage d'accueil - Page vide, ceci évitera qu'à chaque lancement de votre navigateur celui-ci aille se connecter sur le site de Firefox, afin d'éviter d'encombrer inutilement la bande passante de l'Université. - Allez dans le menu
Edition, sous-menuGénéralet choisissezLangue et apparence. Sélectionnez le thèmeSombre, ceci afin de préserver votre rétine (et de diminuer la consommation électrique sur écran OLED). En effet, la lecture de textes en lettres noires sur fond blanc est préjudiciable à votre vue car un écran blanc émet plus de 1000 cd/m² quand les organimes de santé conseillent de ne pas dépasser 200 cd/m² (suivant les conditions lumineuses ambiantes).
- Quittez Firefox et relancez-le, votre logiciel est maintenant configuré.
Remarque Importante : à chaque fois que vous consulterez une page Web externe à l'Université, le navigateur s'adressera directement au serveur proxy qui se chargera de la rapatrier à sa place. Pour que cela fonctionne, il faudra au préalable que vous vous soyez authentifié sur le serveur proxy. C'est pourquoi à chaque fois que vous lancerez le navigateur Firefox, une fenêtre d'authentification s'ouvrira lors de la première connexion vers l'extérieur. Vous devrez rentrer votre login et mot de passe qui figurent sur votre carte d'étudiant. Votre authentification restera active tant que le logiciel Firefox restera ouvert. Toutes les pages que vous consultez sont de cette façon stockées et associées à un utilisateur au niveau des serveurs centraux de la DSIUN et ceci pendant un an comme l'exige l'organisme RENATER responsable des réseaux universitaires.
Le Mail
prenom-nom-numero@etud.univ-tln.fr
Autres commandes utiles
ping: cette commande permet de savoir si une machine est connectée sur le réseau en lui envoyant certaines informations et en attendant un accusé de réception. Elle permet aussi de controler la qualité du transfert entre votre machine et la machine distante en vous donnant une estimation sur le temps de transmission. Syntaxe :ping nom. Pour arrêter cette commande, tapez surCTRL-C.
La machine
yoda.univ-tln.frest-elle sur le réseau ? et la machinewall-e.univ-tln.fr?
tracepath: les informations qui transitent d'une machine à une autre passent par un certain chemin et sont relayées par des machines appelées passerelles. La commandetracepathvous renvoie la liste des passerelles rencontrées (éventuellement aucune), la dernière ligne correspond au nom (ou à l'adresse ip) de la machine distante. Syntaxe :tracepathnom.
Combien de passerelles empruntez-vous pour aller sur
U1-001-1?
who: permet d'obtenir la liste des utilisateurs connectés sur votre machine.w: commewho, mais fournit en plus pour chaque utilisateur le processus en cours d'exécution sur votre machine.
L'éditeur de texte emacs
Pour taper vos programmes ou tout autre texte, vous disposez sous Linux de plusieurs éditeurs de texte plus ou moins conviviaux.
Emacs est un éditeur de texte robuste, puissant et proposant de nombreuses options telles que : la coloration syntaxique pour différents langages, la possibilité de définir des macros en fonction de l'extension du fichier, ...
Pour lancer l'éditeur emacs vous pouvez soit :
- cliquer sur son icône

- le lancer à partir d'une fenêtre terminal en tapant
emacs.
Exécutez les étapes suivantes :
- Ouvrez une fenêtre de terminal si vous n'en avez pas,
- tapez
emacset validez, - la fenêtre de Emacs apparaı̂t. Retournez dans la fenêtre terminal à partir de laquelle vous avez lancé Emacs et tapez la commande
lspour lister le contenu de votre répertoire courant. Vous n'obtenez rien. Pourquoi ? - Retournez dans la fenêtre de Emacs et quittez le logiciel en allant dans le menu
Fileet en choisissantQuit(vous remarquerez qu'une séquence de touches est indiquée entre parenthèses :C-x C-c, qui est le raccourci clavier correspondant à la commande). - Retournez alors dans la fenêtre terminal et tapez
emacs &, puis une fois la fenêtre Emacs ouverte, tapez dans votre terminal la commandels. Que se passe-t-il ? Explication ?
Droits sur les fichiers et les répertoires
C-x C-f (ou en cliquant sur le menu File).C-x C-s ou de cliquer sur le menu File, puis sur le sous-menu Save. Lors de la première sauvegarde vous devrez rentrer le nom du nouveau fichier et dans quel répertoire vous voulez le sauvegarder dans la zone prévue à cet effet tout en bas de la fenêtre Emacs.Exécutez les étapes suivantes :
Créez un fichier quelconque avec Emacs.
Vérifiez les droits par défaut appliqués par le système sur votre fichier.
Créez le fichier hello.py contenant les ligne suivantes :
#!/usr/bin/python3 print("bonjour le monde")Exécutez le fichier
hello.pypar la commande ./hello.py, que se passe-t-il et pourquoi ?Vérifiez les droits du fichier
hello.pyet déduisez-en la valeur par défaut deumask.Pour vérifier votre réponse tapez la commande
umaskqui sans paramètres vous renvoie la valeur des droits par défaut.Faites différents tests avec
umasketchmodpour vérifier que vous avez bien saisi les différentes possibilités de ces deux commandes. En particulier, rendez le fichierhello.pyexécutable et vérifiez sa bonne exécution.
Les processus
ps autorise la visualisation des processus lancés à partir du terminal courant.Tapez dans un terminal la commande
ps. Quelle est la signification des champsPIDetTTY?
ps x.ps :ps uxaffiche la liste de tous vous processus avec votre nom,ps auxaffiche la liste de tous les processus précédés du nom de leur propriétaire,ps laffiche pour chaque processus lancé à partir du terminal courant, le numéro du processus pèrePPID.
ps lx donne la liste de tous vos processus en exécution, avec pour chaque processus le numéro de son père.Exécutez les étapes suivantes :
- à partir d'un terminal (xterm), lancez
xclocken arrière plan (xclock &), ceci affiche une horloge, - à l'aide de la commande
ps, repérez la xterm mère dexclock, - tuez cette xterm avec la commande
kill -9puis affichez la liste de vos processus en exécution : que constatez-vous ? Qui est le père dexclock? Explication ?
Sous Unix TOUT est fichier
Exécutez les étapes suivantes :
A partir d'un terminal, exécutez la commance
cat /etc/passwd. Ceci a pour résultat de vous afficher le contenu du fichier des mots de passe. Au passage familiarisez-vous avec sa structure.Exécutez la commande
cat /etc/passwd > toto. Ceci a pour effet d'afficher le contenu du fichier des mots de passe dans un fichiertotositué dans votre répertoire courant. Vérifiez que ce fichier est bien présent.Ouvrez une deuxième fenêtre terminal. Vous avez maintenant deux terminaux ouverts que nous appellerons T1 et T2. Chacun d'entre eux correspond à un fichier situé dans
/dev.Positionnez vous dans T2 et tapez la commande
tty. Cette commande vous envoie alors le nom du fichier correspondant à T2, par exemple/dev/pts/1.- Laissez T2 ouvert et positionnez-vous dans T1. Tapez alors
cat /etc/passwd > fichier_correspondant_a_T2Ceci a pour effet de recopier le contenu du fichier des mots de passe dans le fichier correspondant à T2. Quel est le résultat obtenu ?
Variables d'environnement, variables locales
Exécutez la commande
env.
Cette commande renvoie la liste des variables d'environnement associées à TOUS les interprètes de commande (shell), i.e. toutes les variables renvoyées par env sont utilisables aussi bien en csh, sh ou en ksh.
Gestion des variables
echo $nom.Définition d'une variable d'environnement :
export nom=valeur.Destruction d'une variable d'environnement :
unset nom./etc/bash.bashrc).Pour vérifier les affirmations précédentes, exécutez les étapes suivantes :
- ouvrez un xterm,
- tapez
env, - faites
export ZZ=7, - affichez les variables de votre environnement,
- tapez alors
csh. Vous venez de changer de shell. - Tapez la commande
env. Que constatez-vous ? - Sortez du
cshen tapantexit. - Lancez un nouveau terminal en arrière plan à partir de votre terminal,
- dans la nouvelle xterm, affichez les variables d'environnement. Que constatez-vous ?
- à présent, ouvrez une xterm en utilisant l'icône associée et recommencez le point précédent. Conclusion ?
nom=valeur. C'est une variable qui n'est connue que du shell courant.unset nomDétruisez la variable d'environnement
ZZet reprenez l'exercice précédent en définissant ZZ comme une variable du shell. Vérifiez que vous avez bien compris la différence entre variable locale et variable d'environnement.
Le fichier .bashrc
.bashrc situé à la racine de votre répertoire, seront connues de toutes les sessions bash (et uniquement de celles-ci). En effet ce fichier est interprété à chaque fois que l'on lance un processus shell (donc en particulier quand on ouvre une fenêtre terminal).Créez ou ouvrez le fichier
~/.bashrcdans lequel vous définirez une variable locale. Ouvrez alors une nouvelle xterm et vérifiez que votre variable existe. Passez encsh. La variable existe-elle toujours ?
Pouvez-vous expliquer le phénomène suivant :
- Dans le fichier .bashrc rajoutez la ligne
a=3. - Ouvrez un nouveau terminal.
- Tapez
echo $a, puisa=$(($a+1))(attention aux espaces !). Réaffichez alors la valeur dea. - Ouvrez un nouveau terminal. Tapez
echo $a. Explication ?
Le Bash
Il existe différentes façons d'affecter une valeur à une variable en bash.
- Méthode Standard :
nom_variable=valeur. Si jamais la valeur contient des séparateurs, il faut alors l'encadrer par des apostrophes (appelées aussi communément cotes) sinon seule la portion située avant le premier séparateur sera contenue dans la variable. - Récupération du résultat d'une commande : il est possible d'affecter le résultat d'une commande à une variable. Pour cela il suffit d'encadrer la commande par des anti-cotes :
nom_variable=‘commande‘(autre possibilité :nom_variable=$(commande)). - Définition d'une variable de type tableau :
nom_variable=(val1 val2 \dots valn). Cette instruction crée une variable de type tableau, on accède à un élément donné en précisant son indice (par exemple${nom_variable[1]}).
var est représentée par $var.A titre d'exemple, exécutez les étapes suivantes :
- Tapez
a=bonjourpuisecho $a. - Tapez
a=bonjour le mondepuisecho $a. - Tapez
a='bonjour le monde'puisecho $a. - Tapez
a=‘who‘, puisecho $a[1] - Tapez
a=(bleu blanc rouge),echo $a, puisecho $a[2].
Quelle différence y a-t-il entre les deux instructions suivantes :
a='bonjour le monde'a=(bonjour le monde)
Les caractères spéciaux
Certains caractères ont pour le bash une signification bien particulière :
< >: caractères de redirection pour les commandes.|: caractère permettant l'enchainement de processus communicants.?: caractère joker pour les noms de fichiers. Représente un caractère quelconque.*: caractère joker pour les noms de fichiers. Représente un ensemble quelconque (éventuellement vide) de caractères.[ ]: caractères utilisés pour accèder aux éléments d'une variable de type liste. Ce sont aussi des caractères jokers pour les noms de fichiers qui permettent de spécifier un ensemble de caractères.': caractère utilisé pour empêcher le shell d'interpréter les caractères spéciaux présents sur la ligne de commande.": permet de construire une chaine après avoir interprété les caractères‘,$et!.\`: caractère utilisé pour récupérer le résultat d'une commande&: caractère utilisé pour lancer un processus en tache de fond.\: caractère de despécialisation. Permet d'inhiber le rôle du caractère qui le suit.!: caractère utilisé pour la gestion du rappel des commandes.( ): caractères utilisés pour la construction de variables de type liste.
Pour vous familiariser avec ces différents caractères et constater leur rôle particulier exécutez les commandes suivantes :
echo *,echo \backslash*,echo '*'echo ',echo \backslash'nom=toto,phrase='bonjour $nom',phrasebis="bonjour $nom"echo $nom,echo $phrase,echo $phrasebis.
La variable et la commande history
La variable history permet de définir le nombre de commandes conservées en mémoire par le bash. Par exemple pour conserver en mémoire les 20 dernières commandes tapées, il suffit de faire set history=20. On manipule alors l'historique de la façon suivante :
- La commande
historyaffiche la liste des commandes conservées en mémoire chacune précédée d'un numéro, !num, rappelle la commande numéronum,!!, rappelle la dernière commande.
La variable PS1
La variable PS1 permet de modifier l'invite du shell. Exemples :
PS1=bonjourPS1='bonjour maitre'PS1='\s-\v\$ '
Remarque : pour la variable PS1 des séquences d'échappement (des caractères précédés de \) ont une signification spéciale (\s le nom du shell, \v sa version, \d la date, ...), voir PROMPTING dans le man de bash.
Les mécanismes de redirection
hello.py, créé précédemment et exécutez wc hello.py. Vous obtenez le nombre de lignes, de mots et de caractères du fichier.Quelle commande faut-il taper pour que ce résultat soit stocké dans le fichier
statistique?
statistique. Quand on redirige la sortie standard d'une commande vers un fichier, la sortie erreur standard reste connectée à l'écran, constatez cela en exécutant wc ficxyz > statistique. Le fichier ficxyz n'existant pas vous devriez obtenir un message d'erreur. Remarquez cependant que le fichier statistique est créé et vide.statistique. Exécutez wc ficxyz &> statistique.Que constatez-vous ? Consultez le contenu du fichier
statistique.
statistique. Exécutez wc hello.py &> statistique.Consultez le contenu du fichier
statistique. Déduisez-en le role de l'opérateur \(\&>\).
wc en redirigeant :- son entrée standard avec un certain fichier fic,
- sa sortie standard sur le fichier
statistique, - sa sortie erreur standard sur le fichier
erreurs
Proposez une solution et testez la en utilisant, dans un premier temps pour fichier fic, le fichier
hello.py, puis un fichier qui n'existe pas (indication : pensez à l'utilisation d'un sous-shell).
Le mécanisme des alias
alias nom commande(s).alias dir=ls(puis tapez la commandedir)alias rm='rm -i'(puis essayez d'effacer un fichier par la commanderm)alias process='ps ux'(puis tapez la commandeprocess)
unalias nomLes fonctions
Syntaxe : function nom { commande(s); }.
Paramètres des fonctions : les arguments d'une fonction sont référencés dans son corps de la même manière que les arguments d'un programme shell le sont, $1 référence le premier argument, $2 le deuxième, etc., $# contient le nombre d'arguments passés lors de l'appel de la fonction.
Exemple : function toto { mkdir $1; cd $2; } s'utilise par toto rep1 rep2 et permet de créer le répertoire rep1 et de positionner rep2 en répertoire de travail.
La commande find
find rep criteres.-name, permet de spécifier le nom (ou le motif) à rechercher,-type T, avec T = f (fichier), d (répertoire), b (périphérique en mode bloc), c (périphérique en mode caractère), l (lien).Exemple :
find / -type ddonne tous les répertoires en parcourant le disque à partir de la racine.-size [+-] taille [ck], avec \(+\) taille maximum, \(-\) taille minimum, \(c\) taille en octets et \(k\) taille en kilo-octets, permet de spécifier une taille minimum ou maximum pour les fichiers recherchés-user proprietaire, permet de spécifier le nom du propriétaire-group groupe, permet de spécifier le nom du groupe propriétaire-perm permissions, permet de spécifier des permissions spécifiques.
find / -perm 741, donne tous les fichiers dont les droits sont rwxr----x-a, i.e au et logique). Sinon, on peut aussi les séparer par l'option -o (qui correspond au ou logique).find / -name '*.h' -o -size +20k. Permet de rechercher à partir de la racine tous les fichiers d'extension .h ou dont la taille n'excède pas 20k.Pourquoi l'extension
.hest délimitée par des cotes ?
find / \( -user 101 -o -group 200 \) -a -size 120k. Cette commande lance la recherche de tous les fichiers dont la taille n'excède pas 120k et dont :- soit l'utilisateur a pour UID 101,
- soit le groupe propriétaire a pour UID 200.
Pourquoi les parenthèses sont précédées du caractère \(\backslash\) ?
find, il est possible d'exécuter une certaine commande grace à l'option suivante: -exec commande options {} \;./tmp on lance l'exécution de la commande : find /tmp -user mon_uid -type f -exec rm {} \;Exercices divers
Redéfinissez votre environnement de façon à ce que la commande mycd affiche le nom du répertoire destination et la liste des fichiers s'y trouvant (définissez un alias).
Créez une fonction cherche qui vous affiche le nom des répertoires où se trouve le fichier passé en argument (vous aurez besoin de la commande dirname).
Créez un alias ecore qui efface tous les fichiers
core(image d'un processus dans un fichier) dans votre répertoire utilisateur et tous ses sous répertoires.
Ecrire la fonction protect qui recherche dans le répertoire passé en argument (et tous ses sous-répertoires) tous les fichiers ayant une permission d'écriture pour les autres et qui la retire (utilisez le man de
findpour en savoir plus sur l'optionperm).

