Introduction course to shell basic commands
tèminal is an educational project, which will be used for an introduction to shell courses.
Note : the school where the course is given, the HEPL from Liège, Belgium, is a french-speaking school. From this point, the instruction will be in french. Sorry.
Note 2 : le présent repository contient le cours d'introduction à la ligne de commande, du temps où ces notions étaient abordée dans le cours de RIA, et non, comme maintenant, dans le cours de Réseaux et serveurs.
Puisque vous allez être amenés à utiliser de manière régulière la ligne de commande dans le cadre du cours de RIA, je laisse ce cours ici pour ceux qui voudraient un peu rappel ou un pense-bête.
Note 3 : certains puristes tombés ici par hasard pourraient avoir à redire sur l'approche et la méthode. Sachez que ce cours est destiné à des étudiants qui n'ont rien d'informaticiens, et qui n'auront de la ligne de commande qu'un approche d'utilisateur ponctuel non-expert.
Les plus intéressés apprendront les détails par eux-même, et le contenu de ce cours est suffisant pour couvrir les besoins du reste du cours de RIA.
Si malgré tout, quelque chose vous chiffonne, n'hésitez pas à créer une issue qu'on puisse en discuter. Un grand merci.
Quand j'ai débuté dans le web, il était impensable d'avoir un jour besoin d'utiliser un terminal ; taper des lignes de commande, c'était réservé aux informaticiens, Dieu nous en préserve...
Mais de nos jours, avec tous les frameworks et outils actuels, il n'est pas rare de commencer un projet par une petite ligne de commande de déploiement, ce que vous avez sûrement déjà dû faire. Aujourd'hui, nous allons aller un peu plus loin en apprennant les bases de la ligne de commande.
Tôt ou tard, vous serez confrontés à un serveur web récalcitrant ou un langage un peu plus bas niveau qui nécéssite quelques manipulations en ligne de commande.
Pour les besoins de ce cours, nous allons nous connecter en ssh sur le serveur local de l'école, pour lequel vous avez déjà reçu (ou allez recevoir) un login et un mot de passe.
Ensuite, nous commencerons le cours et seront prêts à nous connecter.
Si vous êtes sur mac ou linux, il vous suffit d'ouvrir un Terminal, sur windows, le mieux est de télécharger le petit programme Putty, qui se télécharge à l'adresse suivante : putty.org.
Le déroulement du cours et les commandes qui suivent sont données à titre de référence partielle, tout sera détaillé oralement pendant le cours.
Une invite de commande (ou prompt) se termine généralement par un $
. Dans la suite du document, tout bloque de code commencant par un $
signifie que la suite est une commande à entrer dans votre terminal. Le signe dollar ne fait bien sûr par partie de la commande en question.
Les blocs de citation commençant par un triangle (►) sont des indications personnelles sur le topic couvert par la commande. Ils sont là comme références pour moi-même, mais peuvent vous servir de rappel lors de la relecture du document.
Si vous souhaitez une référence pratique à consulter au quotidien, je vous conseille le Mémento Unix/Linux, aux éditions Eyrolles, et si vous voulez aller plus loin, je vous recommande le livre Parlez-vous Shell ?, aux éditions ellipses.
Je vous communiquerai l'adresse de notre serveur une fois en classe.
Essayons de voir si le serveur est live en utilisant la commande ping
. Bien sûr, nous remplaçons server.lan
par l'adresse du serveur local de l'école.
$ ping -c 4 server.lan
► Présentation de la structure d'une commande.
Notre serveur nous ayant répondu, nous allons pouvoir nous y connecter, avec la commande ssh
.
$ ssh -l userX server.lan
Remplacez userX
par votre le nom d'utilisateur qui vous a été attribué à l'école.
Histoire de faciliter un peu notre exercice, on va importer une petite structure de dossiers histoire d'avoir de quoi travailler. Pour cela, on va cloner un repository git spécifiquement créé pour l'occasion.
$ git clone http://reken.krkn.be/hepl/teminal-files.git && cd teminal-files
On vient d'arriver, autant savoir où nous sommes. La commande pwd
va nous aider.
$ pwd
► Présentation de l'arborescence de base d'un système UNIX.
On sait où nous sommes, regardons ce qui s'y trouve, avec ls
.
$ ls
C'est bien mais pas top. Je suis sûr qu'on peut en savoir un peu plus sur ce qu'il y a dans ce répertoire. Consultons le manuel de la commande ls
, grâce à la commande man
.
$ man ls
Nous avons repéré des options intéressantes. Appuyons sur la touche q
pour quitter.
$ ls -Falh
► Explication rapide de l'affichage, on reviendra sur les droits plus loin.
C'est bien mais tant qu'à faire, autant ne pas taper ça à chaque fois. Créons un alias.
$ alias l="ls -Falh"
► Explication de la pérénité de l'alias, présentation rapide des fichiers de profil.
Naviguons un peu.
$ cd files
$ pwd
$ l
Revenons au dossier parent.
$ cd ..
► Présentation du
.
, du..
, du~
et du/
Allons voir ailleurs, utilisons la touche TAB
.
$ cd web/www/
$ pwd
$ l
Mais quelle taille fait-il, ce répertoire ?
$ du
Pas très clair... allons voir le manuel.
$ man du
Maintenant qu'on a les bonnes options, allons-y.
$ du -ha
Bon, c'est bien tout ça, mais moi, j'aime bien avoir un terminal tout propre. Vidons l'écran.
$ clear
Pour lire un fichier, on a l'embarras du choix.
$ cat index.html
Ouais, bon, celle-ci est un peu pif paf pof. Essayons-en une autre.
$ less index.html
Là, c'est tout de suite un peu plus pratiques : les flèches pour naviguer, space
pour la page suivante, b
pour la précédente, q
pour quitter.
Et si je ne voulais voir que le début du fichier ?
$ head index.html
Ou la fin ?
$ tail index.html
Bon, 10 lignes, c'est peu...
$ tail -n 20 index.html
Faisons quelques opérations sur les fichiers avant de les éditer.
D'abord, revenons à notre racine.
$ cd
$ pwd
Allons dans notre dossier web
.
$ cd teminal-files/web
Nous allons copier notre dossier www
vers tmp
, pour travailler sur une copie.
$ cp www tmp
Hum... "cp: omitting directory www
" ? C'est une erreur commune : on veut copier un dossier, on doit donc indiquer à la commande qu'on veut copier tout son contenu récursivement.
$ cp -r
$ ls
Notre dossier tmp
existe, allons jouer un peu.
$ cd tmp
Bon, le fichier comments.php
, j'en ai rien à faire, on va le supprimer.
$ rm comments.php
Pareil pour le dossier images/
.
$ rm images
Ah, zut, c'est un dossier, j'ai oublié...
$ rm -r images
► Parler rapidement du fameux
rm -rf /
Réorganisons un peu le dossier styles/
.
$ cd styles
$ ls
Je ne suis pas fan de l'idée d'avoir notre fichier bootstrap.css
à la racine de styles
. On va le mettre dans un nouveau dossier rien que pour lui, libs
.
$ mkdir libs
$ ls
$ mv bootstrap.css libs
$ ls
$ cd libs
$ ls
Et puis ce serait bien de mettre le numéro de version dans son nom.
$ head bootstrap.css
$ mv bootstrap.css bootstrap-2.1.1.css
$ ls
Retournons à la racine de notre site.
$ cd ~/teminal-files/web/tmp
Créons un fichier vide.
$ touch readme.md
Pour l'éditer, nous allons utiliser l'éditeur de texte nano
.
► Petit mot rapide sur
vim
etemacs
.
$ nano readme.md
On sauve avec CTRL+O
, on quitte avec CTRL+X
.
On va en profiter pour modifier index.html
et intégrer notre changement de chemin pour bootstrap.
Et si on allait un peu voir dans la config ?
$ cd /etc
$ ls
Ici, nous voyons tous les fichiers de config de notre serveur. Et si on rajouter un raccourcis dans les hosts
?
$ nano hosts
Oh, permissions denied. Pourquoi ? Affichons quelques infos sur ce fichier.
$ stat hosts
► Explication du système de droits.
► Petit mot sur lesudo
Comparons avec un de nos fichiers
$ cd
$ stat teminal-files/web/tmp/readme.md
Les droits sont pareils, mais comme le owner
est différent, forcément, ça coince pour le fichier /etc/hosts
.
- aucun
--- (0)
- exécution seulement
--x (1)
- écriture seulement
-w- (2)
- écriture & exécution
-wx (3)
- lecture seulement
r-- (4)
- lecture & exécution
r-x (5)
- lecture & écriture
rw- (6)
- tous
rwx (7)
► De l'importance de bien choisir ses droits.
On va modifier les doits de notre fichier readme pour que n'importe qui puisse écrire dedans.
$ chmod 666 teminal-files/web/tmp/readme.md
Maintenant, on va chacun écrire un mot dans le readme de quelqu'un d'autre.
$ nano /home/user/teminal-files/web/tmp/readme.md
On n'oublie pas de sauvegarder, puis on ferme.
Allons voir notre fichier pour découvrir notre petit mot.
$ cat teminal-files/web/tmp/readme.md
Nettoyons un peu tout ce désordre, pour commencer.
$ clear
La plupart des programmes ont une option permettant de connaître la version installée sur le système.
$ nano --version
On peut aussi savoir où se trouve un programme en utilisant la commande suivante.
$ which nano
Ça nous permet aussi de savoir si un programme est installé ou non.
$ which ruby
Si on ne reçoit rien, c'est que le programme n'existe pas sur la machine.
On peut aussi avoir quelques infos sur le serveur.
$ uname -a
Et savoir depuis combien de temps il est lancé.
$ uptime
► Petit mot rapide sur le load average
Regardons un peu l'état de notre serveur.
$ top
► Présentation rapides des process, et des
PID
.
On peut utiliser la flèche du haut, mais on peut aussi utiliser une commande dédiée.
$ history
Il est aussi possible de faire une recherche dans l'historique des commandes avec le racourci : CTRL+r
On peut avoir les infos de la carte réseau en utilisant ifconfig
.
$ ifconfig
On a vu ping
au début du cours, parlons-en plus longuement.
$ ping 192.168.1.1
N'oublions pas le CTRL+C
pour arrêter le process.
Il y a énormément de possibilités avec la ligne de commande, nous en verrons d'autres dans le cadre des cours sur node.js.
Toutefois, avec les bases présentes, vous êtes déjà parés pour la plupart des cas.
N'hésitez pas à consulter les références données dans l'introduction si vous voulez creuser la question.