TP 6 : Utilisation du terminal sous Linux
Dans ce TP, on s'intéresse à quelques commandes utiles dans le terminal, sous Linux.
Remarque : Windows possède aussi un terminal en ligne de commande (taper touche Windows + R puis cmd). Powershell est une nouvelle interface en ligne de commande sous Windows.
Pour utiliser le terminal, vous pouvez :
- Utiliser une machine virtuelle avec la console (Ctrl + Alt + T)
- Utiliser Jupyter, en commençant chaque commande par
!
ou en utilisant le terminal (File -> New -> Terminal) - Utiliser le terminal (fenêtre à droite) de repl.it
echo
¶
echo
est une commande qui renvoie ses arguments vers la sortie standard (stdout), typiquement l'écran du terminal.
! echo hello # affiche hello sur la sortie standard
hello
Ceci a l'air inutile, mais il y a en fait pas mal d'utilité possibles. Par exemple afficher le contenu d'une variable :
! echo $PATH # affiche le contenu de la variable PATH
/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PATH
est une variable qui indique les chemins (séparés par :
) où Linux doit chercher les exécutables correspondant à une commande du terminal. Par exemple, on peut savoir où est l'exécutable de echo
avec which
:
! which echo
/usr/bin/echo
Il est normalement possible d'afficher de l'aide sur une commande avec, par exemple, man echo
(man
pour manual). Cependant man
ne marche pas sous Jupyter, à cause de l'installation (minimale) de Linux qu'il utilise. Vous pouvez chercher de l'aide sur internet à la place (exemple avec l'aide de echo).
Exercice
Où est situé gcc
, qu'on a utilisé pour compiler un code C ? Et ocaml
? Et python
?
pwd
¶
pwd
(path working directory) donne le répertoire où le terminal est situé :
! pwd
/home/jovyan/work/4_c/tp
ls
¶
ls
permet de lister les fichiers dans le répertoire en cours.
! ls
1_bitfield.ipynb 2_liste_chainee.ipynb 3_representation_binaire.ipynb 4_dyn_array.ipynb 5_string.ipynb 6_bash.ipynb img
ls
possède de nombreuses options utiles. Par exemple, pour afficher chaque fichier avec sa date de modification, la taille du fichier en Ko... :
! ls -l --block-size=K
total 60K -rw-rw-r-- 1 jovyan 1000 9K Nov 25 19:58 1_bitfield.ipynb -rw-r--r-- 1 jovyan 1000 10K Nov 29 09:17 2_liste_chainee.ipynb -rw-r--r-- 1 jovyan 1000 8K Nov 26 16:39 3_representation_binaire.ipynb -rw-r--r-- 1 jovyan 1000 5K Nov 29 09:24 4_dyn_array.ipynb -rw-r--r-- 1 jovyan 1000 6K Dec 2 19:56 5_string.ipynb -rw-r--r-- 1 jovyan users 8K Dec 2 21:03 6_bash.ipynb drwxr-xr-x 2 jovyan 1000 4K Nov 21 13:59 img
On peut aussi donner un paramètre à ls
pour indiquer de quel dossier on veut lister les fichiers :
! ls / # fichiers à la racine de Linux (qui contient tous les autres fichiers)
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
Le système de fichiers de Linux est une arborescence (ou plus simplement un arbre) : le dossier racine /
contient des dossiers (qui sont ses fils), qui eux-mêmes contiennent des fichiers... :
Chaque répertoire dans /
a un rôle bien précis. Voici les plus importants :
bin
etsbin
: exécutables binaires réservé auroot
dev
(devices) : périphériques comme les disques durs, clé USB, CD-ROM... sous forme de dossieretc
: fichiers de configuration, scripts de démarrage...home
contient les répertoires personnels des utilisateurs de l'ordinateurusr
: applications et fichiers accessibles à tous les utilisateurs
cat
¶
cat
(concatenate) permet d'afficher le contenu d'un fichier. Par exemple, le fichier /etc/passwd
contient les utilisateurs avec des informations :
!cat /etc/passwd
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin jovyan:x:1000:100::/home/jovyan:/bin/bash systemd-timesync:x:101:101:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin messagebus:x:104:105::/nonexistent:/usr/sbin/nologin
Les x
signifient que les mots de passe de chaque utilisateur sont stockés dans un fichier /etc/shadow
(en fait ce sont les images par une fonction de hachage, SHA, qui sont stockés) :
! cat /etc/shadow
cat: /etc/shadow: Permission denied
Il faut être root
(administrateur) pour pouvoir lire/modifier /etc/shadow
. Pour passer momentanément en utilisateur root
, il faut écrire sudo cat /etc/shadow
. Vous pouvez le tester sur la machine virtuelle mais pas sur Jupyter (il n'y a pas de droit administrateur pour des questions de sécurité).
Redirection de flux¶
Chaque commande possède une entrée et une sortie. Il est possible de rediriger ces flux avec >
. Par exemple la commande suivante redirige la sortie de echo
et le met dans un fichier (plutôt que sur stdout
, c'est-à-dire le terminal) :
! echo print_int 42 > test.ml # met print_int 42 dans un fichier test.ml
! ls # on voit bien le fichier test.ml
1_bitfield.ipynb 2_liste_chainee.ipynb 3_representation_binaire.ipynb 4_dyn_array.ipynb 5_string.ipynb 6_bash.ipynb img test.ml
Exercice
Vérifier le contenu de test.ml
et l'exécuter avec ocaml test.ml
.
|
(pipe) permet de rediriger la sortie d'une commande vers l'entrée d'une autre commande.
Par exemple, on trouve dans /usr/include
les headers de la glibc, bibliothèque standard du C. Comme il y en a beaucoup, on donne la sortie de ls /usr/include
à la commande head
, qui affiche seulement les 10 premiers :
! ls /usr/include | head
aio.h aliases.h alloca.h argp.h argz.h ar.h arpa asm-generic assert.h byteswap.h
Exercice
Afficher le début du header stdio.h
.
grep
¶
grep
permet de chercher un mot dans un fichier (ou une chaîne de caractères). Par exemple, pour cherche l'utilisateur jovyan
(utilisateur par défaut de Jupyter) dans /etc/passwd
:
! grep jovyan /etc/passwd
jovyan:x:1000:100::/home/jovyan:/bin/bash
Exercice
Chercher le prototype de la fonction strlen
dans string.h
.
grep
utilise l'algorithme d'Aho-Corasick, que l'on verra plus tard ainsi que d'autres méthodes de recherche de chaîne de caractères.
find
¶
find /path/
est comme ls
, mais permet d'afficher récursivement tous les fichiers dans /path/
(dans les sous-dossiers, les sous-sous-dossiers...). On peut ajouter l'option -name "..."
pour chercher des fichiers avec un nom précis :
! find / -name "*.ml" | head # cherche tous les fichiers dans / dont l'extension est .ml
/opt/conda/.opam/default/lib/csexp/csexp.ml /opt/conda/.opam/default/lib/cryptokit/cryptokit.ml /opt/conda/.opam/default/lib/cryptokit/cryptokitBignum.ml /opt/conda/.opam/default/lib/cryptokit/cryptokit__.ml /opt/conda/.opam/default/lib/logs/logs_fmt_top_init.ml /opt/conda/.opam/default/lib/logs/logs_top_init.ml /opt/conda/.opam/default/lib/easy-format/easy_format.ml /opt/conda/.opam/default/lib/mmap/mmap.ml /opt/conda/.opam/default/lib/lwt_ppx/ppx_lwt.ml /opt/conda/.opam/default/lib/biniou/bi_share.ml
*
est un caractère spécial signifiant "n'importe quelle chaîne de caractères". Donc le find
ci-dessus cherche les fichiers commençant par n'importe quel nom, puis finissant par .ml
.
Exercice
Parmi ces fichiers, trouver ceux qui ont list
dans leur nom (on pourra utiliser grep
).
cd
¶
cd
(change directory) change le répertoire de travail :
! cd / # se déplace dans le repertoire racine
Remarque : Sur Jupyter, un nouveau shell est utilisé (et réinitialisé) à chaque commande. Le repertoire de travail sur une autre cellule ne sera donc pas changé par le cd
, alors que c'est le cas dans le terml