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 echo et 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.
u1-001-12.univ-tln.fr
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).
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)?
La commande scp
scp login@nom_de_la_machine:chemin_source chemin_destination
ou
scp login@adresse-ip:chemin_source chemin_destination.
- Créez un fichier de nom mystere contenant 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 scp le fichier mystere pré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
- Lancez Firefox en cliquant sur l'icône :
- Allez dans le menu Edition, sous-menu Paramètres et choisissez Accueil. Activez alors l'option Page 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-menu Général et choisissez Langue et apparence. Sélectionnez le thème Sombre, 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 : A 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 sur CTRL-C.
- 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 commande tracepath vous 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: tracepath nom.
- who: permet d'obtenir la liste des utilisateurs connectés sur votre machine.
- w: comme who, 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.
- Ouvrez une fenêtre de terminal si vous n'en avez pas,
- tapez emacs et 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 ls pour 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 File et en choisissant Quit (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 commande ls. Que se passe-t-il ? Explication ?
Droits sur les fichiers et les répertoires
Pour sauvegarder un fichier, il suffit de taper la séquence de touches 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.
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.py par la commande ./hello.py, que se passe-t-il et pourquoi ?
Vérifiez les droits du fichier hello.py et déduisez-en la valeur par défaut de umask.
Pour vérifier votre réponse tapez la commande umask qui sans paramètres vous renvoie la valeur des droits par défaut.
Faites différents tests avec umask et chmod pour vérifier que vous avez bien saisi les différentes possibilités de ces deux commandes. En particulier, rendez le fichier hello.py exécutable et vérifiez sa bonne exécution.
Les processus
- ps ux affiche la liste de tous vous processus avec votre nom,
- ps aux affiche la liste de tous les processus précédés du nom de leur propriétaire,
- ps l affiche pour chaque processus lancé à partir du terminal courant, le numéro du processus père PPID.
- à partir d'un terminal (xterm), lancez xclock en arrière plan (xclock &), ceci affiche une horloge,
- à l'aide de la commande ps, repérez la xterm mère de xclock,
- tuez cette xterm avec la commande kill -9 puis affichez la liste de vos processus en exécution : que constatez-vous ? Qui est le père de xclock ? Explication ?
Sous Unix TOUT est fichier
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 fichier toto situé 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_T2
Ceci 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
Gestion des variables
- 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 csh en tapant exit.
- 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 ?
Le fichier .bashrc
- Dans le fichier .bashrc rajoutez la ligne a=3.
- Ouvrez un nouveau terminal.
- Tapez echo $a, puis a=$(($a+1)) (attention aux espaces !). Réaffichez alors la valeur de a.
- 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]}).
- Tapez a=bonjour puis echo $a.
- Tapez a=bonjour le monde puis echo $a.
- Tapez a='bonjour le monde' puis echo $a.
- Tapez a=‘who‘, puis echo $a[1]
- Tapez a=(bleu blanc rouge), echo $a, puis echo $a[2].
- 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.
- 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 history affiche la liste des commandes conservées en mémoire chacune précédée d'un numéro,
- !num, rappelle la commande numéro num,
- !!, rappelle la dernière commande.
La variable PS1
La variable PS1 permet de modifier l'invite du shell. Exemples :
- PS1=bonjour
- PS1='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
- son entrée standard avec un certain fichier fic,
- sa sortie standard sur le fichier statistique,
- sa sortie erreur standard sur le fichier erreurs
Le mécanisme des alias
- alias dir=ls (puis tapez la commande dir)
- alias rm='rm -i' (puis essayez d'effacer un fichier par la commande rm)
- alias process='ps ux' (puis tapez la commande process)
Les 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
-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 d donne 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.
- soit l'utilisateur a pour UID 101,
- soit le groupe propriétaire a pour UID 200.
Exercices
\(\bullet\) Redéfinissez votre environnement de façon à ce que :
- les 30 dernières commandes soient sauvegardées,
- le prompt affiche le numéro de la commande en cours,
- la commande mycd affiche le nom du répertoire destination et la liste des fichiers s'y trouvant (définissez un alias).