M22, Session #2
Linux
Trois principes élémentaires pour appréhender le système Linux :
- « tout est fichier » : les fichiers, les répertoires, les liens, les disques et autres périphériques, …
- chaque fichier est dans une arborescence unique, dont la base
/
est appelée racine ou slash. - l’interface utilisateur présente sur quasiment tout système Linux est la ligne de commandes (ou CLI, command line interface). En effet, les serveurs GNU/Linux sont généralement dépourvus d’interface graphique. De plus, il est toujours plus aisé – a fortiori à distance – de lancer des commandes lignes que d’utiliser à une interface graphique.
Interface en ligne de commandes
La ligne de commande est la première interface proposée à l’utilisateur pour interagir avec un système. Les commandes saisies par l’utilisateur sont interprétées par l’interpréteur de commandes aussi nommé shell.
Sur un système serveur, après le démarrage, le système propose généralement à l’utilisateur de s’identifier dans le terminal en mode texte.
Si le système dispose d’une interface graphique la ligne de commandes est accessible, après authentification, au travers d’une application nommée « Terminal » (dans le menu « Accessoires » ou « Système »).
Une fois l’application lancée :
- la combinaison de touches
Ctrl-Shift-T
ouvre un nouvel onglet, Ctrl-D
le ferme,Ctrl-+
augmente la taille des caractères,Ctrl--
la diminue etCtrl-0
permet de la réinitialiser.
Le copier/coller à la souris peut également s’avérer utile :
- sélectionner une zone de texte à la souris suffit à la copier ;
- la combinaison de touches
Shift+Insert
permet de coller, - cliquer avec le bouton du milieu de la souris également
Le shell Bash
Sur la plupart des systèmes, le shell mis à disposition des
utilisateurs est bash (zsh
sur Kali). Le manuel de bash
est
disponible en ligne.
bash
est un environnement de travail agréable et puissant qui
propose entre autres fonctionnalités :
- la gestion de l’historique (
history
), - l’édition de la ligne de commandes,
- la gestion des travaux,
- la gestion de variables d’environnement,
- la gestion d’alias,
- la possibilité de personnaliser son comportement.
C’est également un langage de programmation interprété à part entière.
La syntaxe générale d’une commande est la suivante :
[chemin/]commande [ option ... ] [ argument ... ]
Les options sont généralement introduites par un tiret pour les
options courtes d’un caractère (ex : -R
), ou deux tirets pour les
options longues (ex : --recursive
).
bash
« embarque » un certain nombre de commandes dîtes builtin qui
ne correspondent pas à des fichiers (ex : echo
). La commande type
permet de déterminer le type d’une commande et son chemin le cas
échéant. La commande which
fournit uniquement le chemin et ne
s’applique donc pas aux builtin.
Certaines commandes builtin sont dîtes composées (ex : for …; do…;
done
ou if…; then…; else…; fi
).
Exemple de script :
for i in \ $(for dom in $(virsh list | grep CentOS | tr -s ' ' | cut -d ' ' -f3) do mac=$(virsh dumpxml $dom | grep 'mac address' | cut -d"'" -f2) arp | grep $mac | cut -d' ' -f1 | cut -d. -f4 done) do iptables -t nat -I PREROUTING -p TCP --dport $((6200+i)) -j DNAT \ --to-destination 192.168.144.$i:22 done
Variables d’environnement
Lorsque vous créez un script dans votre répertoire personnel, il peut
être pratique de le rendre exécutable (chmod +x
), mais également de
pouvoir l’exécuter sans préciser son chemin (complet ou relatif).
C’est la variable d’environnement PATH
qui définit ou l’interpréteur
de commandes va aller chercher les exécutables dont le nom est saisi
sur la ligne de commandes.
Cette variable peut être modifiée par l’utilisateur, par exemple :
PATH=$PATH:~
.
Une variable définit dans un terminal n’est disponible que pour ce
terminal. Pour la rendre disponible à tous les environnements de
l’utilisateur (script, autres terminaux, …), il faut l’exporter :
export $PATH
.
La commande env
liste toutes les variables d’environnement de
l’utilisateur.
Noms de fichiers et caractères spéciaux
Les fichiers sont désignés par leur nom complet (depuis la racine) ou
relatif (depuis le répertoire courant). Le nom d’un fichier peut
contenir n’importe quel caractère sauf /
qui utilisé pour identifier
le chemin d’accès à un fichier. Il est toutefois préférable d’éviter
les caractères spéciaux :
#
- préfixe les commentaires
=
- assignation de variables
*
- (glob), englobe toutes les correspondances possibles d’une chaîne de caractères
()
- exécute des commandes dans un sous-shell (permet de réaliser des opérations arithmétiques lorsque doublé)
{}
- format de liste
~
- raccourci vers l’espace de l’utilisateur ou l’espace d’un utilisateur lorsqu’un nom est précisé en préfixe
[]
- alias de
test
, déprécié, à utiliser doublé |
- (pipe) pour le chaînage de commandes (ou logique si doublé)
&
- exécute la commande précédente en tâche de fond (et logique si doublé)
;
- sépare plusieurs commandes sur une même ligne
<
et>
- redirecteurs d’entrée/sorties
- l’esspace
- sépare la commande, les options et les arguments
$
- préfixe les noms de variables
\
- caractère d’échappement de l’interprétation pour pouvoir utiliser les caractères spéciaux en tant que simple chaîne de caractère
'
- simple quote, encadre une chaîne de caractère non interprétée
"
- double quote, encadre une chaîne de caractère interprétée
?
- (glob), sorte de joker qui remplace un seul caractère (la
variable
$?
contient la valeur de retour de la dernière commande) - et
!
- inverse le code de retour de la commande qu’il précède (contient la commande précédente si doublé)
Il faut également éviter d’utiliser -
comme premier caractère.
Commandes de base
Tout au long de votre vie professionnelle, vous aurez l’occasion, de découvrir de nouvelles commandes, par des collègues, dans des documentations… Il est essentiel de prendre le temps de systématiquement déconstruire ces commandes pour apprendre à les utiliser correctement et en tirer le meilleur parti.
Les commandes disposent généralement d’une page de manuel accessible
avec la commande man
. Par exemple, pour consulter la page de manuel
de l’interpréteur de commandes directement depuis la ligne de
commande, on utilisera la commande man bash
.
La mise en page du manuel à l’écran est assurée par un programme nommé
pager, qui est généralement more
ou – mieux – less
. Ce
programme dispose lui-même d’une page de manuel (utiliser les flèches
de direction pour naviguer dans la page et la touche q
pour
quitter).
Le manuel est organisé autour de 8 sections :
- Commandes utilisateur
- Appels système (fournis par le noyau)
- Fonctions de bibliothèque
- Fichiers spéciaux (
/dev/*
) - Formats de fichier
- Jeux
- Divers
- Commandes privilégiées et d’administration système.
Certaines pages de manuel peuvent être présentes dans plusieurs
sections (ex : man 1 stat
et man 2 stat
).
Il est possible de voir une introduction concernant chacun de ces
chapitres avec la commande man -a intro
. Pour plus d’informations :
man man
.
NB : Voir aussi apropos
(exemple apropos 'copy files'
), help
, =info
Premières commandes
Après le premier redémarrage qui suit l’installation (Suivre les menus Troubleshooting puis Boot from Local Hard Drive si nécessaire), il est possible de se connecter à la machine virtuelle dans la console.
etu.lpasrsi.net login: utilisateur Password: Ni root, ni maître ! Last login: Thu Sep 23 08:17:45 2021 [utilisateur@localhost ~]$ ip address show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:d8:09:e0 brd ff:ff:ff:ff:ff:ff inet 192.168.144.157/24 brd 192.168.144.255 scope global dynamic noprefixroute ens3 valid_lft 41119sec preferred_lft 41119sec inet6 fe80::5054:ff:fed8:9e0/64 scope link noprefixroute valid_lft forever preferred_lft forever
Le dernier octet est 157
, il doit donc être possible de se connecter
à la machine virtuelle sur le port 6357
du serveur vdi.unicaen.fr
.
$ ssh -p 6357 utilisateur@vdi.unicaen.fr utilisateur@vdi.unicaen.fr's password: Last login: Thu Sep 23 14:40:11 2021 [utilisateur@localhost ~]$ who utilisateur tty1 2021-09-23 08:40 utilisateur pts/0 2021-09-23 08:31 (10.192.96.12) [utilisateur@localhost ~]$ pwd /home/utilisateur [utilisateur@localhost ~]$ ls [utilisateur@localhost ~]$ ls -a . .. .bash_history .bash_logout .bash_profile .bashrc [utilisateur@localhost ~]$ ps PID TTY TIME CMD 994 pts/0 00:00:00 bash 1021 pts/0 00:00:00 ps [utilisateur@localhost ~]$ ss --tcp --all State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* ESTAB 0 36 192.168.144.157:ssh 10.192.96.12:58812 LISTEN 0 128 [::]:ssh [::]:*
Le serveur écoute sur le port 22 les connexions à un service appelé SSH.
SSH, le Secure SHell
SSH est à la fois un protocole réseau et une application. SSH permet d’obtenir — en toute sécurité — un shell (ou interpréteur de commandes) à distance sur une machine proposant ce service (c’est-à-dire sur laquelle « tourne » la partie serveur de l’application).
Il faut — évidemment — disposer d’un compte sur le serveur distant ; alors il est possible de s’authentifier avec un mot de passe (si le serveur le permet), voire — mieux ! — en utilisant une clé de chiffrement asymétrique.
En effet, les robots scanners de vulnérabilités sur le réseau sont à l’affut de ce genre de service nouvellement installé, ne disposant d’aucune sorte de sécurisation et donc potentiellement exploitable par brute force pour obtenir un accès aux ressources.
Pour limiter ce type d’exploit, il faut commencer par interdire les connexions par mot de passe. Avant cela, il va falloir organiser l’accès par clé.
Vulgarisation du mécanisme cryptographique
Les principes de base sont les suivants :
- Un utilisateur dispose d’une paire de clé :
- une clé publique (qui peut/doit être distribuée)
- et une autre privée (qui doit rester secrète).
- Ce que la clé publique chiffre, la clé privée le déchiffre : ce mécanisme garantit la confidentialité.
- Ce que la clé privée chiffre, la clé publique le déchiffre : ce mécanisme permet l’authentification.
TP #2 : Connexion SSH à la VM
- Sur le client, générer une paire de clés SSH sans utiliser
de passphrase (
ssh-keygen
) - Afficher le contenu de la clé privée (
~/.ssh/id_rsa
) et les permissions sur le fichier - Supprimer la paire de clés
- Générer une paire de clés en veillant bien à chiffrer la clé privée par une passphrase
- Afficher le contenu de la clé privée (
~/.ssh/id_rsa
) et les permissions sur le fichier - Copier la clé publique générée dans le fichier
~/.ssh/authorized_keys
sur le serveur (votre VM). Il existe plusieurs solutions utilisant par exemplessh-copy-id
,scp
, copier/coller, voire un tiers de confiance disposant des accès requis - Se connecter en SSH sans utiliser de mot de passe
En cas de problème :
- Vérifier les droits sur les différents fichiers générés côté client et serveur
- Au pire, supprimer les fichiers générés et réessayer en procédant différemment (autre commande, avec ou sans passphrase, …)
- Éventuellement, lancer le serveur SSH en mode debug :
$ sudo systemctl stop sshd # Arrêter le service $ sudo /usr/sbin/sshd -d # Le lancer en mode debug … # Réaliser les tests et lire les retours $ sudo systemctl start sshd # Relancer le service une fois terminé
Pour permettre l’accès de votre enseignant préféré à votre serveur :
- créer un compte
olm
(useradd
) - ajouter le compte au groupe
wheel
(usermod
) - écrire la chaîne de caractères suivantes dans le fichier
/home/olm/.ssh/authorized_keys
:ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJg4KOijZ2P2EVC8FYP1bvCoxKDfrOYG7ORfYWvAfDUA olm@n306z-olm001.campus.unicaen.fr
- si nécessaire (
ls -lRa /home/olm
), aligner les droits sur les fichiers (chown
)
TP #3 : Sécurisation du service SSH
Maintenant que vous vous connectez à votre serveur sans mot de passe, configurer le serveur SSH pour interdire la connexion par mot de passe et sécuriser ainsi un peu plus le service. Quels directives de configuration avez-vous mis en place ?
TP #4 : Commandes de base
Pour ce TP, il est vivement conseiller d’utiliser la complétion
fournie par la touche TAB
.
- Afficher la date actuelle avec la commande
date
, au formatjj mois yy
. Quelle commande avez-vous utilisée ?. Trouvez une autre façon de faire ! - Dans votre répertoire utilisateur (utiliser
pwd
pour afficher le nom du répertoire courant), créer un répertoire nommé travail (mkdir
,ls
pour vérifier). Dans ce répertoire travail, créer 3 sous-répertoire nommés alice_au_pays_des_merveilles, bob_the_sponge_with_square_pants et paul_le_vilain_pirate_malefique. Le répertoire alice_au_pays_des_merveilles devra contenir un sous répertoire nommé lapin_blanc. Justifier le résultat de la commandecd ~/travail && ls -R
? - Copier (
cp
) le fichier/usr/share/man/man1/man.1.gz
dans le répertoire bob_the_sponge_with_square_pants. Recopier le contenu du répertoire bob_the_sponge_with_square_pants dans paul_le_vilain_pirate_malefique avec une seule commande. Quelle est la dernière commande que vous avez utilisé ? - Renommer (
mv
) le répertoire paul_le_vilain_pirate_malefique en pirate. Se placer dans le répertoire alice_au_pays_des_merveilles. Déplacer le répertoire lapin_blanc dans le répertoire parent du répertoire alice_au_pays_des_merveilles, sans utiliser la chaîne de caractère travail. Quelle commande avez-vous utilisée ? - Supprimer le répertoire (
rmdir
) lapin_blanc. Supprimer le répertoire travail. Quelle est la dernière commande utilisée ?
Ressources complémentaires
Raccourcis d’édition de la ligne de commande
Pour tirer partie au mieux des capacités de l’interpréteur de commandes, il est indispensable d’exploiter l’ensemble des fonctionnalités d’édition et d’historique offertes par la bibliothèque GNU readline.
L’édition des commandes est héritée de l’éditeur GNU Emacs. La notation dans la suite de cette section est celle utilisée dans les manuels de bash, readline et emacs :
C
fait référence à la toucheControl
ouCtrl
du clavierM
à la toucheAlt
.
M-C-x
s’obtient donc en appuyant simultanément sur Alt
, Ctrl
et
x
.
Les commandes les plus utiles (liste non exhaustive) sont les suivantes :
- Commandes de déplacement
←
et→
: déplacement d’un caractère vers la gauche et la droiteC-←
etC-→
: déplacement d’un mot vers la gauche et la droiteC-a
: début de la ligneC-e
: fin de la ligne
- Commandes de suppression
Suppr
ouDel
: supprime le caractère sous le curseurRet.arr.
ouBackspace
: supprime le caractère à gauche du curseur
- Commandes « couper »
C-k
: couper du curseur à la fin de la ligneC-u
: couper du curseur au début de la ligneM-Backspace
: coupe du curseur au début du mot précédentC-w
: couper du curseur à l’espace précédent
- Commandes « coller »
C-y
: coller le contenu du presse-papierM-y
: circuler dans le contenu du presse-papier (ne peut être utilisé qu’aprèsC-y
ouM-y
)
- Autres commandes d’édition
C-_
: annuler la dernière éditionTab
: complète le nom de la commande ou du fichier (voire des options de la commande si le paquetagebash-completion
est installé) dont les premiers caractères ont déjà été saisis
- Commandes liées à l’historique
- : lignes de commande précédente et suivante
C-r
: rechercher dans les lignes de commande antérieuresC-s
: rechercher dans les lignes de commandes suivantes
Brève histoire des OS
- 1940–1960
- OS mono-tâches (batch).
- 1960–1970
- OS à tâches multiplexées :
- 1970–1980
- Développement des micro-ordinateurs, ou ordinateurs personnels (PC, personal computers). Deux principaux OS : Microsoft DOS (ex-DOS/BASIC, ex-QDOS) et le futur MacOS.
- 1983
- le 27 septembre, Richard M. Stallman annonce son intention de développer un OS baptisé GNU (pour GNU’s Not Unix) dont le code source serait distribué gratuitement (comme il l’a fait pour son éditeur de texte, Emacs).
- 1987
- Andrew Tanenbaum (auteur de la « bible » : Operating Systems : Design and Implementation) crée un OS, Minix, pour ses besoins d’enseignement. Évidemment le code source est disponible.
- 1991
- Linus Torvalds, inspiré par Minix, développe Linux, le noyau d’un nouvel OS : GNU/Linux. Il le publie sous licence GPL.
Distributions Linux
- Une distribution Linux est définie par le dispositif d’installation du système qu’elle propose, l’environnement graphique fourni par défaut à l’utilisateur, le système de gestion des paquetages logiciels qu’elle utilise, les programmes propres au format de paquetage afférent, les logiciels spécifiques qui l’accompagne, le support aux utilisateurs et ses modalités (communautaire, commercial, … ), la distribution de binaires ou des sources (rolling release), …
- Il existe une grande variété de distributions Linux, qu’il est possible de trier suivant différents critères : parts de marché, format de paquetage des logiciels, facilité de mise en œuvre, fréquence de mise à jour, qualité, stabilité, positionnement par rapport aux principes fondamentaux du logiciel libre, …
- Les principaux formats de paquetages sont DEB (Debian) et RPM (RPM Package Manager).
- Certaines distributions s’appuient sur tout ou partie de
distributions préexistantes (ex : Ubuntu issue de Debian),
d’autres encore sont des versions partielles, de développement ou
recompilées de distributions préexistantes. Aussi, il est possible
de définir la filiation des distributions (non exhaustive) :
- Slackware
- la plus ancienne distribution GNU/Linux a servi de base à Suse, la première distribution commerciale, devenue Suse Linux Enterprise et OpenSuse sa version libre et communautaire.
- Debian
- distribution non commerciale, régie par un contrat social, supportant de très nombreuses architectures, au cycle de développement très rigoureux (rigide ?), extrêmement stable, est à la base de la distribution grand public Ubuntu, ayant elle-même généré de nombreux dérivés qui souvent reviennent à une base Debian (Backtrack devenu Kali Linux, Mint, …).
- Red Hat
- dont sont issues RHEL et Fedora, sa version communautaire au cycle de développement rapide et CentOS, version strictement recompilée de ses sources.
Voir aussi :
Liens
- Fish Shell, un shell de ligne de commande intelligent et convivial pour les systèmes Unix
- 10 raisons pour lesquelles la ligne de commande est plus adaptée à l’utilisateur que l’interface graphique
- In the Beginning… Was the Command Line
- L’art de la ligne de commande
- Différents terminaux graphiques
- Multiplexeurs de terminaux
- D’autres shells
- Linux, histoire d’un noyau vieux de 25 ans
- Petite histoire du Bourne Shell
- Histoire des shells Linux
- Guide bash pur les débutants
- Commandes shell d’exception
- Curriculum d’un opérateur système