La ligne de commande Linux pour les débutants

Vue d’ensemble

La ligne de commande Linux est une interface textuelle avec votre ordinateur. Souvent appelée shell, terminal, console, invite ou autres noms divers, elle peut donner l’impression d’être complexe et confuse à utiliser. Pourtant, la possibilité de copier et de coller des commandes à partir d’un site web, combinée à la puissance et à la souplesse de la ligne de commande, signifie que son utilisation peut être essentielle lorsque vous essayez de suivre des instructions en ligne, dont beaucoup sur ce même site web !

Ce tutoriel vous apprendra un peu de l’histoire de la ligne de commande, puis vous fera faire des exercices pratiques pour vous familiariser avec quelques commandes et concepts de base. Nous ne supposerons aucune connaissance préalable, mais nous espérons qu’à la fin, vous vous sentirez un peu plus à l’aise la prochaine fois que vous serez confronté à des instructions qui commencent par “Ouvrir un terminal”.

Ce que vous apprendrez :

  • Un peu d’histoire de la ligne de commandement
  • Comment accéder à la ligne de commande depuis votre propre ordinateur
  • Comment effectuer quelques manipulations de base sur les fichiers
  • Quelques autres commandes utiles
  • Comment enchaîner les commandes pour obtenir des outils plus puissants
  • La meilleure façon d’utiliser les pouvoirs de l’administrateur

Ce dont vous aurez besoin

  • Un ordinateur fonctionnant sous Ubuntu ou une autre version de Linux

Chaque système Linux comprend une ligne de commande d’un type ou d’un autre. Ce tutoriel comprend quelques étapes spécifiques pour Ubuntu 18.04 mais la plupart du contenu devrait fonctionner quelle que soit votre distribution Linux.

Une brève leçon d’histoire

Pendant les années de formation de l’industrie informatique, l’un des premiers systèmes d’exploitation s’appelait Unix. Il a été conçu pour fonctionner comme un système multi-utilisateurs sur des ordinateurs centraux, les utilisateurs se connectant à distance via des terminaux individuels. Ces terminaux étaient assez basiques par rapport aux normes modernes : juste un clavier et un écran, sans pouvoir exécuter des programmes localement. Ils se contentaient d’envoyer des frappes au serveur et d’afficher à l’écran toutes les données qu’ils recevaient. Il n’y avait pas de souris, pas de graphisme fantaisiste, pas même de choix de couleur. Tout était envoyé sous forme de texte, et reçu sous forme de texte. Il est donc évident que tout programme fonctionnant sur l’ordinateur central devait produire du texte en sortie et accepter du texte en entrée.

Par rapport aux graphiques, le texte est très léger en ressources. Même sur les machines des années 1970, qui faisaient fonctionner des centaines de terminaux avec des connexions réseau d’une lenteur glaciale (selon les normes actuelles), les utilisateurs étaient encore capables d’interagir avec des programmes rapidement et efficacement. Les commandes étaient également très concises afin de réduire le nombre de frappes nécessaires, ce qui accélérait encore plus l’utilisation du terminal. Cette rapidité et cette efficacité sont l’une des raisons pour lesquelles cette interface textuelle est encore largement utilisée aujourd’hui.

Lorsqu’ils étaient connectés à un ordinateur central Unix via un terminal, les utilisateurs devaient encore gérer le type de tâches de gestion de fichiers que vous pourriez désormais effectuer avec une souris et quelques fenêtres. Qu’il s’agisse de créer des fichiers, de les renommer, de les placer dans des sous-répertoires ou de les déplacer sur le disque, les utilisateurs des années 70 pouvaient tout faire entièrement avec une interface textuelle.

Chacune de ces tâches nécessitait son propre programme ou sa propre commande : une pour changer de répertoire (cd), une autre pour lister leur contenu (ls), une troisième pour renommer ou déplacer des fichiers (mv), etc. Afin de coordonner l’exécution de chacun de ces programmes, l’utilisateur se connectait à un seul programme maître qui pouvait ensuite être utilisé pour lancer n’importe lequel des autres. En enveloppant les commandes de l’utilisateur, ce programme “shell”, comme on l’appelait, pouvait fournir des capacités communes à n’importe laquelle d’entre elles, comme la possibilité de passer des données d’une commande directement à une autre, ou d’utiliser des caractères génériques spéciaux pour travailler avec de nombreux fichiers de même nom en même temps. Les utilisateurs pouvaient même écrire un code simple (appelé “scripts shell”) qui pouvait être utilisé pour automatiser de longues séries de commandes shell afin de faciliter des tâches complexes. Le programme shell original d’Unix s’appelait simplement sh, mais il a été étendu et remplacé au fil des ans, de sorte que sur un système Linux moderne, vous utilisez très probablement un shell appelé bash. Ne vous inquiétez pas trop du shell que vous avez, tout le contenu de ce tutoriel fonctionnera sur à peu près tous les shells.

Linux est en quelque sorte un descendant d’Unix. La partie centrale de Linux est conçue pour se comporter de manière similaire à un système Unix, de sorte que la plupart des anciens shells et autres programmes en mode texte s’y exécutent sans problème. En théorie, vous pourriez même connecter un de ces vieux terminaux des années 1970 à un boîtier Linux moderne, et accéder au shell par ce biais. Mais de nos jours, il est beaucoup plus courant d’utiliser un terminal logiciel : la même vieille interface texte de style Unix, mais fonctionnant dans une fenêtre à côté de vos programmes graphiques. Voyons comment vous pouvez faire cela vous-même !

Ouverture d’un terminal

Sur un système Ubuntu 18.04, vous pouvez trouver un lanceur pour le terminal en cliquant sur l’élément Activités en haut à gauche de l’écran, puis en tapant les premières lettres de “terminal”, “commande”, “prompt” ou “shell”. Oui, les développeurs ont configuré le lanceur avec tous les synonymes les plus courants, vous ne devriez donc avoir aucun problème pour le trouver.

Les autres versions de Linux, ou d’autres saveurs d’Ubuntu, ont généralement un lanceur de terminal situé au même endroit que vos autres lanceurs d’applications. Il peut être caché dans un sous-menu ou vous devrez peut-être le rechercher dans votre lanceur, mais il est probable qu’il se trouve quelque part.

Si vous ne trouvez pas de lanceur, ou si vous voulez simplement un moyen plus rapide de faire apparaître le terminal, la plupart des systèmes Linux utilisent le même raccourci clavier par défaut pour le démarrer : Ctrl-Alt-T.

Quelle que soit la façon dont vous lancez votre terminal, vous devriez vous retrouver avec une fenêtre d’apparence plutôt terne avec un bout de texte bizarre en haut, un peu comme l’image ci-dessous. Selon votre système Linux, les couleurs peuvent ne pas être les mêmes et le texte sera probablement différent, mais la disposition générale d’une fenêtre avec une grande zone de texte (généralement vide) devrait être similaire.

Faisons notre premier commandement. Cliquez avec la souris dans la fenêtre pour vous assurer que c’est bien là que vos frappes vont aller, puis tapez la commande suivante, tout en minuscules, avant d’appuyer sur la touche Entrée ou Retour pour l’exécuter.

pwd

Vous devriez voir un chemin d’accès au répertoire imprimé (probablement quelque chose comme /home/VOTRE_NOM_D’UTILISATEUR), puis une autre copie de ce bout de texte bizarre.

Il y a quelques éléments de base à comprendre ici, avant d’entrer dans le détail de ce que le commandement a réellement fait. Premièrement, lorsque vous tapez une commande, elle apparaît sur la même ligne que le texte impair. Ce texte est là pour vous dire que l’ordinateur est prêt à accepter une commande, c’est la façon dont l’ordinateur vous invite. En fait, on l’appelle généralement l’invite, et vous pouvez parfois voir des instructions qui disent “afficher une invite”, “ouvrir une invite de commande”, “à l’invite du bas” ou similaire. Il s’agit simplement de différentes façons de vous demander d’ouvrir un terminal pour accéder à un shell.

En ce qui concerne les synonymes, une autre façon de considérer l’invite est de dire qu’il y a une ligne dans le terminal dans laquelle vous tapez des commandes. Une ligne de commande, si vous voulez. Encore une fois, si vous voyez la mention “ligne de commande”, y compris dans le titre de ce même tutoriel, c’est juste une autre façon de parler d’un shell s’exécutant dans un terminal.

La deuxième chose à comprendre est que lorsque vous exécutez une commande, toute sortie qu’elle produit sera généralement imprimée directement dans le terminal, puis une autre invite vous sera présentée une fois qu’elle sera terminée. Certaines commandes peuvent produire beaucoup de texte, d’autres fonctionneront en silence et ne produiront rien du tout. Ne vous inquiétez pas si vous exécutez une commande et qu’une autre invite apparaît immédiatement, car cela signifie généralement que la commande a réussi. Si vous repensez aux lentes connexions réseau de nos terminaux des années 1970, ces premiers programmeurs ont décidé que si tout se passait bien, ils pouvaient aussi bien économiser quelques précieux octets de transfert de données en ne disant rien du tout.

Sensibilité à la casse

Soyez particulièrement attentif à la casse lorsque vous tapez dans la ligne de commande. Taper PWD au lieu de pwd produira une erreur, mais parfois la mauvaise casse peut faire apparaître une commande qui semble s’exécuter, mais qui ne fait pas ce que vous attendez. Nous examinerons la casse un peu plus loin, mais pour l’instant, assurez-vous de taper toutes les lignes suivantes exactement dans la casse indiquée.

Aller plus loin

Passons maintenant à la commande elle-même. pwd est l’abréviation de “print working directory”. Tout ce qu’il fait, c’est imprimer le répertoire de travail actuel du shell. Mais qu’est-ce qu’un répertoire de travail ?

Un concept important à comprendre est que l’interpréteur de commandes a la notion d’un emplacement par défaut dans lequel toutes les opérations sur les fichiers auront lieu. C’est son répertoire de travail. Si vous essayez de créer de nouveaux fichiers ou répertoires, de visualiser des fichiers existants, ou même de les supprimer, le shell supposera que vous les recherchez dans le répertoire de travail actuel, sauf si vous prenez des mesures pour spécifier le contraire. Il est donc très important de garder une idée du répertoire dans lequel le shell se trouve à un moment donné, après tout, supprimer des fichiers dans le mauvais répertoire pourrait être désastreux. Si vous avez le moindre doute, la commande pwd vous indiquera exactement quel est le répertoire de travail actuel.

Vous pouvez changer le répertoire de travail en utilisant la commande cd, une abréviation pour “change directory”. Essayez de taper ce qui suit :

cd /
pwd

Notez que le séparateur de répertoire est une barre oblique (“/”), et non la barre oblique inverse à laquelle vous pouvez être habitué depuis les systèmes Windows ou DOS

Votre répertoire de travail est maintenant “/”. Si vous venez d’un environnement Windows, vous êtes probablement habitué à ce que chaque disque ait sa propre lettre, votre disque dur principal étant généralement “C :”. Les systèmes de type Unix ne divisent pas les disques comme cela. Ils ont plutôt un système de fichiers unique et unifié, et les disques individuels peuvent être attachés (“montés”) à n’importe quel endroit du système de fichiers qui soit le plus logique. Le répertoire “/”, souvent appelé répertoire racine, est la base de ce système de fichiers unifié. De là, tout le reste se ramifie pour former une arborescence de répertoires et de sous-répertoires.

Trop de racines
Attention : bien que le répertoire “/” soit parfois appelé le répertoire racine, le mot “racine” a une autre signification. root est également le nom qui a été utilisé pour le super-utilisateur depuis les débuts d’Unix. Le super-utilisateur, comme son nom l’indique, a plus de pouvoirs qu’un utilisateur normal, et peut donc facilement faire des ravages avec une commande mal tapée. Nous examinerons plus en détail le compte du super-utilisateur dans la section 7. Pour l’instant, il vous suffit de savoir que le mot “root” a plusieurs significations dans le monde Linux, le contexte est donc important.

À partir du répertoire racine, la commande suivante vous fera passer dans le répertoire “home” (qui est un sous-répertoire immédiat de “/”) :

cd home
pwd

Pour aller jusqu’au répertoire parent, dans ce cas pour revenir à “/”, utilisez la syntaxe spéciale de deux points (..) lors du changement de répertoire (notez l’espace entre cd et .., contrairement au DOS, vous ne pouvez pas taper cd… comme une seule commande) :

cd ..
pwd

Taper un cd tout seul est un raccourci rapide pour revenir à votre répertoire personnel :

cd
pwd

Vous pouvez également utiliser plus d’une fois si vous devez passer par plusieurs niveaux de répertoires parents :

cd ../..
pwd

Remarquez que dans l’exemple précédent, nous avons décrit un itinéraire à suivre dans les annuaires. Le chemin que nous avons utilisé signifie “en partant du répertoire de travail, déplacez-vous vers le parent / à partir de ce nouvel emplacement, déplacez-vous à nouveau vers le parent”. Donc, si nous voulions aller directement de notre répertoire d’origine au répertoire “etc” (qui se trouve directement à la racine du système de fichiers), nous pourrions utiliser cette approche :

cd
pwd

cd ../../etc
pwd

Les chemins relatifs et absolus

La plupart des exemples que nous avons examinés jusqu’à présent utilisent des chemins relatifs. Autrement dit, l’endroit où vous vous retrouvez dépend de votre répertoire de travail actuel. Pensez à essayer de faire un cd dans le dossier “etc”. Si vous êtes déjà dans le répertoire racine, cela fonctionnera très bien :

cd /
pwd
cd etc
pwd

Mais qu’en est-il si vous êtes dans l’annuaire de votre domicile ?

cd
pwd
cd etc
pwd

Vous verrez une erreur indiquant “No such file or directory” avant même d’exécuter le dernier pwd. Changer de répertoire en spécifiant le nom du répertoire, ou en utilisant aura des effets différents selon l’endroit d’où vous partez. Le chemin d’accès n’a de sens que par rapport à votre répertoire de travail.

Mais nous avons vu deux commandes qui sont absolues. Quel que soit votre répertoire de travail actuel, elles auront le même effet. La première, c’est lorsque vous lancez le cd tout seul pour aller directement dans votre répertoire d’origine. La seconde est lorsque vous utilisez cd / pour passer à la racine du répertoire. En fait, tout chemin qui commence par une barre oblique est un chemin absolu. Vous pouvez penser que cela signifie “passez à la racine du répertoire, puis suivez le chemin à partir de là”. Cela nous donne un moyen beaucoup plus facile de passer au répertoire etc, quel que soit l’endroit où nous nous trouvons dans le système de fichiers :

cd
pwd
cd /etc
pwd

Cela nous donne également un autre moyen de revenir à votre répertoire d’origine, et même aux dossiers qui s’y trouvent. Supposons que vous vouliez aller directement dans votre dossier “Desktop” à partir de n’importe quel endroit du disque (notez le “D” majuscule). Dans la commande suivante, vous devrez remplacer USERNAME par votre propre nom d’utilisateur, la commande whoami vous rappellera votre nom d’utilisateur, au cas où vous ne seriez pas sûr :

whoami
cd /home/USERNAME/Desktop
pwd

Il existe un autre raccourci pratique qui fonctionne comme un chemin absolu. Comme vous l’avez vu, utiliser “/” au début de votre chemin signifie “en partant du répertoire racine”. L’utilisation du caractère tilde (“~”) au début du chemin signifie également “à partir de mon répertoire d’origine”.

cd ~
pwd

cd ~/Desktop
pwd

Maintenant, ce texte bizarre dans l’invite pourrait avoir un peu de sens. Avez-vous remarqué qu’il change lorsque vous vous déplacez dans le système de fichiers ? Sur un système Ubuntu, il indique votre nom d’utilisateur, le nom du réseau de votre ordinateur et le répertoire de travail actuel. Mais si vous êtes quelque part dans votre répertoire personnel, il utilisera “~” comme abréviation. Voyons un peu le système de fichiers, et surveillez l’invite pendant que vous le faites :

cd
cd /
cd ~/Desktop
cd /etc
cd /var/log
cd ..
cd

Vous devez vous ennuyer à vous déplacer dans le système de fichiers maintenant, mais une bonne compréhension des chemins absolus et relatifs sera inestimable alors que nous allons créer de nouveaux dossiers et fichiers !

Création de dossiers et de fichiers

Dans cette section, nous allons créer de véritables fichiers avec lesquels nous allons travailler. Pour éviter de piétiner accidentellement l’un de vos fichiers réels, nous allons commencer par créer un nouveau répertoire, bien éloigné de votre dossier d’origine, qui servira d’environnement plus sûr pour faire des expériences :

mkdir /tmp/tutorial
cd /tmp/tutorial

Notez l’utilisation d’un chemin absolu, pour s’assurer que nous créons le répertoire du tutoriel dans /tmp. Sans la barre oblique au début, la commande mkdir essaierait de trouver un répertoire tmp dans le répertoire de travail actuel, puis essaierait de créer un répertoire de tutoriel à l’intérieur de celui-ci. Si elle ne trouve pas de répertoire tmp, la commande échoue.

Au cas où vous n’auriez pas deviné, mkdir est l’abréviation de “make directory”. Maintenant que nous sommes en sécurité dans notre zone de test (vérifiez avec pwd si vous n’êtes pas certain), créons quelques sous-répertoires :

mkdir dir1 dir2 dir3

Il y a quelque chose d’un peu différent dans ce commandement. Jusqu’à présent, nous n’avons vu que des commandes qui fonctionnent seules (cd, pwd) ou qui ont un seul élément après (cd /, cd ~/Desktop). Mais cette fois, nous avons ajouté trois choses après la commande mkdir. Ces choses sont appelées paramètres ou arguments, et différentes commandes peuvent accepter différents nombres d’arguments. La commande mkdir attend au moins un argument, alors que la commande cd peut fonctionner avec zéro ou un, mais pas plus. Voyez ce qui se passe lorsque vous essayez de passer le mauvais nombre de paramètres à une commande :

mkdir
cd /etc ~/Desktop

Retour à nos nouveaux annuaires. La commande ci-dessus aura créé trois nouveaux sous-répertoires à l’intérieur de notre dossier. Regardons-les avec la commande ls (list) :

ls

Si vous avez suivi les dernières commandes, votre terminal devrait ressembler à ceci :

Notez que mkdir a créé tous les dossiers dans un seul répertoire. Il n’a pas créé de dir3 dans le dir2 dans le dir1, ni aucune autre structure imbriquée. Mais il est parfois pratique de pouvoir faire exactement cela, et mkdir a un moyen :

mkdir -p dir4/dir5/dir6
ls

Cette fois, vous verrez que seul le dir4 a été ajouté à la liste, car le dir5 est à l’intérieur de celle-ci, et le dir6 est à l’intérieur de celle-ci. Plus tard, nous installerons un outil utile pour visualiser la structure, mais vous avez déjà suffisamment de connaissances pour le confirmer :

cd dir4
ls
cd dir5
ls
cd ../..

Le “-p” que nous avons utilisé s’appelle une option ou un interrupteur (dans ce cas, il signifie “créer aussi les répertoires parents”). Les options sont utilisées pour modifier le mode de fonctionnement d’une commande, ce qui permet à une seule commande de se comporter de différentes manières. Malheureusement, en raison des bizarreries de l’histoire et de la nature humaine, les options peuvent prendre différentes formes dans différentes commandes. Vous les verrez souvent comme des caractères uniques précédés d’un trait d’union (comme dans ce cas), ou comme des mots plus longs précédés de deux traits d’union. La forme à un seul caractère permet de combiner plusieurs options, mais toutes les commandes ne l’acceptent pas. Et pour compliquer encore les choses, certaines commandes n’identifient pas du tout clairement leurs options, le fait qu’une option soit ou non une option est dicté uniquement par l’ordre des arguments ! Vous n’avez pas à vous soucier de toutes les possibilités, sachez simplement que les options existent et qu’elles peuvent prendre plusieurs formes différentes. Par exemple, ce qui suit signifie exactement la même chose :

# Don't type these in, they're just here for demonstrative purposes
mkdir --parents --verbose dir4/dir5
mkdir -p --verbose dir4/dir5
mkdir -p -v dir4/dir5
mkdir -pv dir4/dir5

Maintenant, nous savons comment créer plusieurs répertoires en les passant simplement comme arguments de séparation à la commande mkdir. Mais supposons que nous voulions créer un répertoire avec un espace dans le nom ? Essayons :

mkdir another folder
ls

Vous n’avez probablement même pas eu besoin de taper celui-ci pour deviner ce qui allait se passer : deux nouveaux dossiers, l’un appelé autre et l’autre appelé dossier. Si vous voulez travailler avec des espaces dans les noms de répertoires ou de fichiers, vous devez les échapper. Ne vous inquiétez pas, personne ne s’évadera de prison ; l’évasion est un terme informatique qui désigne l’utilisation de codes spéciaux pour dire à l’ordinateur de traiter des caractères particuliers différemment de la normale. Entrez les commandes suivantes pour essayer différentes façons de créer des dossiers avec des espaces dans le nom :

mkdir "folder 1"
mkdir 'folder 2'
mkdir folder\ 3
mkdir "folder 4" "folder 5"
mkdir -p "folder 6"/"folder 7"
ls

Bien que la ligne de commande puisse être utilisée pour travailler avec des fichiers et des dossiers comportant des espaces dans leur nom, la nécessité de les faire échapper par des guillemets ou des barres obliques inverses rend les choses un peu plus difficiles. Vous pouvez souvent reconnaître une personne qui utilise beaucoup la ligne de commande rien qu’à son nom de fichier : elle aura tendance à s’en tenir aux lettres et aux chiffres, et à utiliser des traits de soulignement (“_”) ou des tirets (“-“) au lieu d’espaces.

Créer des fichiers en utilisant la redirection

Notre dossier de démonstration commence à sembler assez rempli de répertoires, mais il manque quelque peu de fichiers. Remédions à cela en redirigeant la sortie d’une commande de sorte qu’au lieu d’être imprimée à l’écran, elle se retrouve dans un nouveau fichier. Tout d’abord, rappelez-vous ce que la commande ls affiche actuellement :

ls

Supposons que nous voulions capturer la sortie de cette commande sous forme de fichier texte que nous pouvons regarder ou manipuler plus loin. Tout ce que nous devons faire est d’ajouter le caractère plus grand que (“>”) à la fin de notre ligne de commande, suivi du nom du fichier dans lequel nous voulons écrire :

ls > output.txt

Cette fois, il n’y a rien d’imprimé à l’écran, car la sortie est plutôt redirigée vers notre fichier. Si vous exécutez ls seul, vous devriez voir que le fichier output.txt a été créé. Nous pouvons utiliser la commande cat pour en examiner le contenu :

cat output.txt

D’accord, ce n’est donc pas exactement ce qui était affiché à l’écran auparavant, mais il contient toutes les mêmes données, et il est dans un format plus utile pour la suite du traitement. Examinons une autre commande, echo :

echo "This is a test"

Oui, l’écho se contente de réimprimer ses arguments (d’où le nom). Mais combinez-le avec une redirection, et vous avez un moyen de créer facilement de petits fichiers de test :

echo "This is a test" > test_1.txt
echo "This is a second test" > test_2.txt
echo "This is a third test" > test_3.txt
ls

Vous devez cat chacun de ces fichiers pour vérifier leur contenu. Mais le cat est plus qu’un simple visualiseur de fichiers – son nom vient de “concatenate”, qui signifie “relier”. Si vous passez plus d’un nom de fichier à cat, il affichera chacun d’entre eux, l’un après l’autre, comme un seul bloc de texte :

cat test_1.txt test_2.txt test_3.txt

Lorsque vous souhaitez passer plusieurs noms de fichiers à une seule commande, il existe des raccourcis utiles qui peuvent vous éviter de taper beaucoup si les fichiers ont des noms similaires. Un point d’interrogation (” ?”) peut être utilisé pour indiquer “n’importe quel caractère” dans le nom du fichier. Un astérisque (“*”) peut être utilisé pour indiquer “zéro ou plusieurs caractères”. Ces caractères sont parfois appelés “jokers”. Quelques exemples peuvent aider, les commandes suivantes font toutes la même chose :

cat test_1.txt test_2.txt test_3.txt
cat test_?.txt
cat test_*

Il faut plus d’échappatoires
Comme vous l’avez peut-être deviné, cette capacité signifie également que vous devez échapper aux noms de fichiers contenant des caractères ? ou *. Il est généralement préférable d’éviter toute ponctuation dans les noms de fichiers si vous souhaitez les manipuler à partir de la ligne de commande.

Si vous regardez la sortie de ls, vous remarquerez que les seuls fichiers ou dossiers qui commencent par “t” sont les trois fichiers tests que nous venons de créer, vous pourriez donc simplifier encore plus cette dernière commande en la faisant passer à cat t*, ce qui signifie “concaténer tous les fichiers dont les noms commencent par un t et sont suivis de zéro ou de plusieurs autres caractères”. Utilisons cette possibilité pour réunir tous nos fichiers en un seul nouveau fichier, puis visualisons-le :

cat t* > combined.txt
cat combined.txt

Que pensez-vous qu’il se passera si nous exécutons ces deux commandes une seconde fois ? L’ordinateur se plaindra-t-il, parce que le fichier existe déjà ? Ajoutera-t-il le texte au fichier, de sorte qu’il en contienne deux copies ? Ou le remplacera-t-il entièrement ? Essayez de voir ce qui se passe, mais pour éviter de retaper les commandes, vous pouvez utiliser les touches “Flèche vers le haut” et “Flèche vers le bas” pour vous déplacer dans l’historique des commandes que vous avez utilisées. Appuyez plusieurs fois sur la flèche vers le haut pour atteindre le premier cat et appuyez sur la touche Entrée pour l’exécuter, puis refaites la même chose pour atteindre le second.

Comme vous pouvez le voir, le fichier se présente de la même façon. Ce n’est pas parce qu’il n’a pas été modifié, mais parce que le shell efface tout le contenu du fichier avant d’y écrire la sortie de la commande de votre cat. Pour cette raison, vous devez être très prudent lorsque vous utilisez la redirection pour vous assurer que vous n’écrasez pas accidentellement un fichier dont vous avez besoin. Si vous souhaitez ajouter au contenu des fichiers, plutôt que de le remplacer, doublez le caractère plus grand que la lettre :

cat t* >> combined.txt
echo "I've appended a line!" >> combined.txt
cat combined.txt

Répétez le premier cat plusieurs fois, en utilisant la flèche vers le haut pour plus de commodité, et ajoutez peut-être quelques autres commandes echo arbitraires, jusqu’à ce que votre document texte soit si volumineux qu’il ne pourra pas tenir dans le terminal en une seule fois lorsque vous utiliserez le cat pour l’afficher. Afin de voir le fichier entier, nous devons maintenant utiliser un programme différent, appelé pager (parce qu’il affiche votre fichier une “page” à la fois). L’ancien pager standard s’appelait more, car il mettait une ligne de texte au bas de chaque page qui disait “-More-” pour indiquer que vous n’aviez pas encore tout lu. De nos jours, il existe un bien meilleur pager que vous devriez utiliser à la place : parce qu’il remplace more, les programmeurs ont décidé de l’appeler less.

less combined.txt

Lorsque vous visualisez un fichier par less, vous pouvez utiliser les touches Flèche haut, Flèche bas, Page haut, Page bas, Accueil et Fin pour vous déplacer dans votre fichier. Essayez de voir la différence entre ces touches. Lorsque vous avez fini de visualiser votre fichier, appuyez sur q pour quitter less et revenir à la ligne de commande.

Une note sur les minuscules/majuscules

Les systèmes Unix sont sensibles à la casse, c’est-à-dire qu’ils considèrent “A.txt” et “a.txt” comme deux fichiers différents. Si vous exécutez les lignes suivantes, vous obtiendrez trois fichiers :

echo "Lower case" > a.txt
echo "Upper case" > A.TXT
echo "Mixed case" > A.txt

D’une manière générale, vous devez essayer d’éviter de créer des fichiers et des dossiers dont le nom ne varie qu’au cas par cas. Cela permettra non seulement d’éviter toute confusion, mais aussi de prévenir les problèmes liés à l’utilisation de différents systèmes d’exploitation. Windows, par exemple, n’est pas sensible à la casse, ce qui fait que les trois noms de fichiers ci-dessus sont traités comme un seul fichier, ce qui peut entraîner des pertes de données ou d’autres problèmes.

Vous pourriez être tenté d’appuyer sur la touche de verrouillage des majuscules et d’utiliser les majuscules pour tous vos noms de fichiers. Mais la grande majorité des commandes shell sont en minuscules, de sorte que vous devrez fréquemment l’activer et la désactiver pendant que vous tapez. La plupart des utilisateurs expérimentés de la ligne de commande ont tendance à s’en tenir principalement aux noms en minuscules pour leurs fichiers et répertoires, de sorte qu’ils n’ont que rarement à se soucier des conflits de noms de fichiers, ou de la casse à utiliser pour chaque lettre du nom.

Bonnes pratiques de dénomination
Si vous tenez compte à la fois de la sensibilité aux majuscules et de l’évasion, une bonne règle de base est de garder vos noms de fichiers tout en minuscules, avec seulement des lettres, des chiffres, des traits de soulignement et des traits d’union. Pour les fichiers, il y a généralement aussi un point et quelques caractères à la fin pour indiquer le type de fichier dont il s’agit (appelé “extension de fichier”). Cette directive peut sembler restrictive, mais si vous finissez par utiliser la ligne de commande avec une certaine fréquence, vous serez heureux de vous en tenir à ce schéma.

Déplacement et manipulation de fichiers

Maintenant que nous disposons de quelques dossiers, examinons le type de tâches quotidiennes que vous pourriez avoir à effectuer sur eux. En pratique, vous utiliserez probablement encore un programme graphique lorsque vous voudrez déplacer, renommer ou supprimer un ou deux fichiers, mais savoir comment le faire en utilisant la ligne de commande peut être utile pour les modifications en masse, ou lorsque les fichiers sont répartis dans différents dossiers. En outre, vous en apprendrez davantage sur la ligne de commande en cours de route.

Commençons par placer notre fichier combined.txt dans notre répertoire dir1, en utilisant la commande mv (move) :

mv combined.txt dir1

Vous pouvez confirmer que le travail a été fait en utilisant ls pour voir qu’il est manquant dans le répertoire de travail, puis cd dir1 pour changer en dir1, ls pour voir qu’il est là, puis cd … pour déplacer le répertoire de travail à nouveau. Vous pouvez également économiser beaucoup de frappe en passant directement à la commande ls pour obtenir directement la confirmation que vous recherchez :

ls dir1

Supposons maintenant qu’il s’avère que ce fichier ne devrait pas se trouver dans le dir1 après tout. Remettons-le dans le répertoire de travail. Nous pourrions faire un cd dans le répertoire dir1 puis utiliser mv combined.txt … pour dire “déplacer combined.txt dans le répertoire parent”. Mais nous pouvons utiliser un autre raccourci de chemin pour éviter de changer de répertoire du tout. De la même manière que deux points (..) représentent le répertoire parent, un seul point (.) peut être utilisé pour représenter le répertoire de travail actuel. Comme nous savons qu’il n’y a qu’un seul fichier dans le répertoire 1, nous pouvons également utiliser “*” pour faire correspondre n’importe quel nom de fichier dans ce répertoire, ce qui nous évite d’avoir à taper quelques touches de plus. Notre commande pour déplacer le fichier dans le répertoire de travail devient donc celle-ci (notez l’espace avant le point, il y a deux paramètres qui sont passés à mv) :

mv dir1/* .

La commande mv nous permet également de déplacer plus d’un fichier à la fois. Si vous passez plus de deux arguments, le dernier est considéré comme le répertoire de destination et les autres sont considérés comme des fichiers (ou répertoires) à déplacer. Utilisons une seule commande pour déplacer combined.txt, tous nos fichiers test_n.txt et dir3 dans dir2. Il y a un peu plus de choses à faire ici, mais si vous regardez chaque argument à la fois, vous devriez pouvoir comprendre ce qui se passe :

mv combined.txt test_* dir3 dir2
ls
ls dir2

Le fichier combined.txt ayant été déplacé dans le dir2, que se passe-t-il si nous décidons qu’il est à nouveau au mauvais endroit ? Au lieu de la dir2, il aurait dû être placé dans la dir6, qui est celle qui se trouve dans la dir5, qui est dans la dir4. Avec ce que nous savons maintenant sur les chemins, ce n’est pas un problème non plus :

mv dir2/combined.txt dir4/dir5/dir6
ls dir2
ls dir4/dir5/dir6

Remarquez comment notre commande mv nous permet de déplacer le fichier d’un répertoire à l’autre, même si notre répertoire de travail est quelque chose de complètement différent. C’est une propriété puissante de la ligne de commande : quel que soit l’endroit où vous vous trouvez dans le système de fichiers, il est toujours possible d’opérer sur des fichiers et des dossiers situés à des endroits totalement différents.

Puisque nous semblons utiliser (et déplacer) beaucoup ce fichier, nous devrions peut-être en garder une copie dans notre répertoire de travail. De même que la commande mv déplace les fichiers, la commande cp les copie (encore une fois, notez l’espace avant le point) :

cp dir4/dir5/dir6/combined.txt .
ls dir4/dir5/dir6
ls

Super ! Maintenant, créons une autre copie du fichier, dans notre répertoire de travail mais avec un nom différent. Nous pouvons utiliser la commande cp à nouveau, mais au lieu de lui donner un chemin de répertoire comme dernier argument, nous lui donnerons un nouveau nom de fichier à la place :

cp combined.txt backup_combined.txt
ls

C’est bien, mais peut-être que le choix du nom de sauvegarde pourrait être meilleur. Pourquoi ne pas le renommer pour qu’il apparaisse toujours à côté du fichier original dans une liste triée. La ligne de commande Unix traditionnelle gère un renommage comme si vous déplaciez le fichier d’un nom à un autre, donc notre vieil ami mv est la commande à utiliser. Dans ce cas, il vous suffit de spécifier deux arguments : le fichier que vous voulez renommer et le nouveau nom que vous souhaitez utiliser.

mv backup_combined.txt combined_backup.txt
ls

Cela fonctionne également pour les répertoires, ce qui nous permet de trier ceux qui sont difficiles et qui comportent des espaces dans le nom que nous avons créé précédemment. Pour éviter de retaper chaque commande après la première, utilisez la flèche vers le haut pour faire apparaître la commande précédente dans l’historique. Vous pouvez ensuite modifier la commande avant de l’exécuter en déplaçant le curseur vers la gauche et la droite avec les touches fléchées, et en supprimant le caractère à gauche avec la touche Retour arrière ou celui sur lequel le curseur se trouve avec la touche Supprimer. Enfin, tapez le nouveau caractère à sa place, et appuyez sur Entrée ou Retour pour exécuter la commande une fois que vous avez terminé. Veillez à modifier les deux apparences du chiffre dans chacune de ces lignes.

mv "folder 1" folder_1
mv "folder 2" folder_2
mv "folder 3" folder_3
mv "folder 4" folder_4
mv "folder 5" folder_5
mv "folder 6" folder_6
ls

Suppression de fichiers et de dossiers

Avertissement
Dans la section suivante, nous allons commencer à supprimer des fichiers et des dossiers. Pour vous assurer que vous ne supprimez rien par accident dans votre dossier personnel, utilisez la commande pwd pour vérifier que vous êtes toujours dans le répertoire /tmp/tutorial avant de continuer.

Nous savons maintenant comment déplacer, copier et renommer des fichiers et des répertoires. Cependant, étant donné qu’il ne s’agit que de fichiers tests, peut-être n’avons-nous pas vraiment besoin de trois copies différentes de combined.txt après tout. Mettons un peu d’ordre, en utilisant la commande rm (remove) :

rm dir4/dir5/dir6/combined.txt combined_backup.txt

Peut-être devrions-nous également supprimer certains de ces annuaires excédentaires :

rm folder_*

Que s’y est-il passé ? Eh bien, il s’avère que le rm a un petit filet de sécurité. Bien sûr, vous pouvez l’utiliser pour supprimer chaque fichier d’un répertoire avec une seule commande, en effaçant accidentellement des milliers de fichiers en un instant, sans aucun moyen de les récupérer. Mais il ne vous permet pas de supprimer un répertoire. Je suppose que cela permet d’éviter de supprimer accidentellement des milliers d’autres fichiers, mais il semble un peu mesquin qu’une commande aussi destructrice s’oppose à la suppression d’un répertoire vide. Heureusement, il existe une commande rmdir (remove directory) qui fera le travail à notre place :

rmdir folder_*

C’est un peu mieux, mais il y a encore une erreur. Si vous lancez ls, vous verrez que la plupart des dossiers ont disparu, mais le folder_6 est toujours là. Comme vous vous en souvenez peut-être, le folder_6 contient toujours un folder 7, et rmdir ne supprime que les dossiers vides. Encore une fois, c’est un petit filet de sécurité pour vous empêcher de supprimer accidentellement un dossier plein de fichiers alors que vous n’en aviez pas l’intention.

Dans ce cas, cependant, nous en avons l’intention. L’ajout d’options à nos commandes rm ou rmdir nous permettra d’effectuer des actions dangereuses sans l’aide d’un filet de sécurité ! Dans le cas de rmdir, nous pouvons ajouter un commutateur -p pour lui dire de supprimer également les répertoires parents. Considérez cela comme le contrepoint de mkdir -p. Ainsi, si vous lancez rmdir -p dir1/dir2/dir3, il supprimera d’abord dir3, puis dir2, et enfin dir1. Mais il suit toujours les règles normales de rmdir qui consistent à ne supprimer que les répertoires vides, donc s’il y avait aussi un fichier dans dir1, par exemple, seuls les dir3 et dir2 seraient supprimés.

Une approche plus courante, lorsque vous êtes vraiment, vraiment, vraiment sûr de vouloir supprimer un répertoire entier et tout ce qu’il contient, consiste à dire à rm de fonctionner de manière récursive en utilisant le commutateur -r, auquel cas il supprimera volontiers les dossiers ainsi que les fichiers. En gardant cela à l’esprit, voici la commande pour se débarrasser de ce fâcheux folder_6 et du sous-répertoire qui s’y trouve :

rm -r folder_6
ls

N’oubliez pas : bien que le rm -r soit rapide et pratique, il est également dangereux. Il est plus sûr de supprimer explicitement les fichiers pour vider un répertoire, puis de faire un cd … au parent avant d’utiliser rmdir pour le supprimer.

Avertissement important
Contrairement aux interfaces graphiques, rm ne déplace pas les fichiers vers un dossier appelé “corbeille” ou similaire. Au lieu de cela, il les supprime totalement, complètement et irrévocablement. Vous devez faire très attention aux paramètres que vous utilisez avec rm pour vous assurer que vous ne supprimez que le(s) fichier(s) que vous avez l’intention de supprimer. Vous devez faire particulièrement attention lorsque vous utilisez des jokers, car il est facile de supprimer accidentellement plus de fichiers que vous ne le vouliez. Un caractère espace erroné dans votre commande peut la changer complètement : rm t* signifie “supprimer tous les fichiers commençant par t”, alors que rm t * signifie “supprimer le fichier t ainsi que tout fichier dont le nom est composé de zéro ou plusieurs caractères, ce qui serait tout ce qui se trouve dans le répertoire ! Si vous n’êtes pas du tout sûr, utilisez l’option -i (interactive) pour rm, qui vous demandera de confirmer la suppression de chaque fichier ; entrez Y pour le supprimer, N pour le conserver et appuyez sur Ctrl-C pour arrêter complètement l’opération.

D’autres commandes bien utiles

Les ordinateurs et les téléphones d’aujourd’hui ont des capacités graphiques et audio que les utilisateurs de nos terminaux des années 70 ne pouvaient même pas imaginer. Pourtant, c’est le texte qui prévaut encore comme moyen d’organiser et de classer les fichiers. Qu’il s’agisse du nom du fichier lui-même, des coordonnées GPS intégrées dans les photos que vous prenez sur votre téléphone ou des métadonnées stockées dans un fichier audio, le texte joue toujours un rôle essentiel dans tous les aspects de l’informatique. Nous avons de la chance que la ligne de commande Linux comprenne des outils puissants pour manipuler le contenu textuel, et des moyens de relier ces outils entre eux pour créer quelque chose de plus performant encore.

Commençons par une question simple. Combien de lignes y a-t-il dans votre fichier combined.txt ? La commande wc (word count) peut nous dire qu’en utilisant le commutateur -l pour lui indiquer que nous ne voulons que le nombre de lignes (elle peut également faire le compte des caractères et, comme son nom l’indique, le compte des mots) :

wc -l combined.txt

De même, si vous vouliez savoir combien de fichiers et de dossiers se trouvent dans votre répertoire d’origine, puis faire le ménage après vous, vous pourriez le faire :

ls ~ > file_list.txt
wc -l file_list.txt
rm file_list.txt

Cette méthode fonctionne, mais créer un fichier temporaire pour conserver la sortie de ls seulement pour la supprimer deux lignes plus tard semble un peu excessif. Heureusement, la ligne de commande Unix fournit un raccourci qui vous évite de créer un fichier temporaire, en prenant la sortie d’une commande (appelée sortie standard ou STDOUT) et en l’introduisant directement comme entrée d’une autre commande (entrée standard ou STDIN). C’est comme si vous aviez connecté un tuyau entre la sortie d’une commande et l’entrée de la commande suivante, à tel point que ce processus est en fait appelé “piping” des données d’une commande à l’autre. Voici comment faire passer la sortie de notre commande ls dans wc :

ls ~ | wc -l

Notez qu’aucun fichier temporaire n’est créé et qu’aucun nom de fichier n’est nécessaire. Les tuyaux fonctionnent entièrement en mémoire, et la plupart des outils en ligne de commande Unix s’attendront à recevoir des données d’un tuyau si vous ne leur indiquez pas de fichier sur lequel travailler. En regardant la ligne ci-dessus, vous pouvez voir qu’il s’agit de deux commandes, ls ~ (liste du contenu du répertoire d’origine) et wc -l (compter les lignes), séparées par un caractère de barre verticale (“|”). Ce processus d’insertion d’une commande dans une autre est si communément utilisé que le caractère lui-même est souvent appelé “caractère de canalisation”, donc si vous voyez ce terme, vous savez maintenant qu’il signifie simplement la barre verticale.

Notez que les espaces autour du caractère “pipe” ne sont pas importants, nous les avons utilisés pour plus de clarté, mais la commande suivante fonctionne tout aussi bien, cette fois pour nous dire combien d’éléments se trouvent dans le répertoire /etc :

ls /etc|wc -l

Ouf ! C’est un sacré paquet de dossiers. Si nous voulions les lister tous, il est clair que cela remplirait plus qu’un seul écran. Comme nous l’avons découvert précédemment, lorsqu’une commande produit beaucoup de résultats, il vaut mieux en utiliser less pour la visualiser, et ce conseil s’applique toujours lorsqu’on utilise un tuyau (rappelez-vous, appuyez sur q pour quitter) :

ls /etc | less

Pour en revenir à nos propres fichiers, nous savons comment obtenir le nombre de lignes dans combined.txt, mais étant donné qu’il a été créé en concaténant les mêmes fichiers plusieurs fois, je me demande combien de lignes uniques il y a ? Unix a une commande, uniq, qui ne produit que des lignes uniques dans le fichier. Nous devons donc cat le fichier et le faire passer par uniq. Mais tout ce que nous voulons, c’est un nombre de lignes, donc nous devons aussi utiliser wc. Heureusement, la ligne de commande ne vous limite pas à une seule ligne à la fois, ce qui nous permet de continuer à enchaîner autant de commandes que nécessaire :

cat combined.txt | uniq | wc -l

Cette ligne a probablement donné lieu à un décompte assez proche du nombre total de lignes du dossier, si ce n’est exactement le même. Ce n’est sûrement pas possible ? Coupez le dernier tuyau pour voir la sortie de la commande pour avoir une meilleure idée de ce qui se passe. Si votre fichier est très long, vous voudrez peut-être le faire passer par less pour faciliter l’inspection :

cat combined.txt | uniq | less

Il semble que très peu, voire pas du tout, de nos lignes en double soient supprimées. Pour comprendre pourquoi, nous devons examiner la documentation relative au command uniq. La plupart des outils de la ligne de commande sont accompagnés d’un manuel d’instruction succinct man (et parfois pas si succinct), accessible par le biais de la commande man (manuel). La sortie est automatiquement acheminée sur votre pager, qui est généralement less, de sorte que vous pouvez faire des allers-retours dans la sortie, puis appuyer sur q lorsque vous avez terminé :

man uniq

Comme ce type de documentation est accessible via la commande man, vous l’entendrez appeler “page man”, comme dans “consultez la page man pour plus de détails”. Le format des pages de manuel est souvent laconique, considérez-les davantage comme une présentation rapide d’une commande que comme un tutoriel complet. Elles sont souvent très techniques, mais vous pouvez généralement sauter la plupart du contenu et rechercher simplement les détails de l’option ou de l’argument que vous utilisez.

La page de manuel uniq est un exemple typique en ce sens qu’elle commence par une brève description d’une ligne de la commande, passe à un synopsis de son utilisation, puis présente une description détaillée de chaque option ou paramètre. Mais si les pages de manuel sont inestimables, elles peuvent aussi être impénétrables. Il est préférable de les utiliser lorsque vous avez besoin d’un rappel d’un commutateur ou d’un paramètre particulier, plutôt que comme ressource générale pour apprendre à utiliser la ligne de commande. Néanmoins, la première ligne de la section DESCRIPTION de man uniq répond à la question de savoir pourquoi les lignes en double n’ont pas été supprimées : elle ne fonctionne que sur les lignes adjacentes correspondantes.

La question est donc de savoir comment réorganiser les lignes de notre fichier de manière à ce que les doublons se trouvent sur des lignes adjacentes. Si nous devions trier le contenu du fichier par ordre alphabétique, cela ferait l’affaire. Unix propose une commande sort pour faire exactement cela. Une vérification rapide de man sort montre que nous pouvons passer un nom de fichier directement à la commande, voyons donc ce que cela fait à notre fichier :

sort combined.txt | less

Vous devriez pouvoir voir que les lignes ont été réorganisées, et qu’il est maintenant possible de passer directement en uniq. Nous pouvons enfin terminer notre tâche de comptage des lignes uniques dans le fichier :

sort combined.txt | uniq | wc -l

Comme vous pouvez le voir, la possibilité de transférer des données d’une commande à l’autre, en constituant de longues chaînes pour manipuler vos données, est un outil puissant, tout en réduisant le besoin de fichiers temporaires et en vous épargnant beaucoup de frappe. C’est pourquoi vous le verrez utilisé assez souvent dans les lignes de commande. Une longue chaîne de commande peut sembler intimidante au début, mais n’oubliez pas que vous pouvez décomposer la plus longue chaîne en commandes individuelles (et consulter leurs pages de manuel) pour mieux comprendre ce qu’elle fait.

De nombreux manuels
La plupart des outils en ligne de commande de Linux comprennent une page de manuel. Essayez de jeter un bref coup d’oeil aux pages de certaines des commandes que vous avez déjà rencontrées : man ls, man cp, man rmdir, etc. Il y a même une page de manuel pour le programme man lui-même, auquel on accède en utilisant man man, bien sûr.

La ligne de commande et le super-utilisateur

Une bonne raison pour apprendre les bases de la ligne de commande est que les instructions en ligne favorisent souvent l’utilisation de commandes shell plutôt que d’une interface graphique. Lorsque ces instructions nécessitent des modifications sur votre machine qui vont au-delà de la modification de quelques fichiers dans votre répertoire d’origine, vous serez inévitablement confronté à des commandes qui doivent être exécutées en tant qu’administrateur de la machine (ou super-utilisateur en langage Unix). Avant de commencer à exécuter des commandes arbitraires que vous trouvez dans un coin sombre de l’internet, il est utile de comprendre les implications de l’exécution en tant qu’administrateur, et comment repérer les instructions qui le nécessitent, afin de mieux évaluer si elles peuvent être exécutées en toute sécurité ou non.

Le super-utilisateur est, comme son nom l’indique, un utilisateur doté de super-pouvoirs. Dans les anciens systèmes, c’était un véritable utilisateur, avec un vrai nom d’utilisateur (presque toujours “root”) que vous pouviez utiliser comme si vous aviez le mot de passe. Quant à ces super pouvoirs : root peut modifier ou supprimer tout fichier dans n’importe quel répertoire du système, quel que soit son propriétaire ; root peut réécrire les règles du pare-feu ou démarrer des services réseau qui pourraient potentiellement ouvrir la machine à une attaque ; root peut arrêter la machine même si d’autres personnes l’utilisent encore. En bref, root peut faire à peu près n’importe quoi, en contournant facilement les protections qui sont généralement mises en place pour empêcher les utilisateurs de dépasser leurs limites.

Bien sûr, une personne connectée en tant que root est tout aussi capable de faire des erreurs que n’importe qui d’autre. Les annales de l’histoire de l’informatique sont remplies de récits de commandes mal tapées qui ont effacé tout le système de fichiers ou tué un serveur vital. Il y a aussi la possibilité d’une attaque malveillante : si un utilisateur est connecté en tant que root et quitte son bureau, il n’est pas trop difficile pour un collègue mécontent de sauter sur sa machine et de faire des dégâts. Malgré cela, la nature humaine étant ce qu’elle est, de nombreux administrateurs se sont rendus coupables au fil des ans d’utiliser le compte root comme leur principal, ou unique, compte.

N’utilisez pas le compte racine
Si quelqu’un vous demande d’activer le compte racine, ou de vous connecter en tant que root, soyez très méfiant de ses intentions.

Dans un effort pour réduire ces problèmes, de nombreuses distributions Linux ont commencé à encourager l’utilisation de la commande su. Celle-ci est décrite comme l’abréviation de “super-utilisateur” ou “changer d’utilisateur”, et permet de passer à un autre utilisateur sur la machine sans avoir à se déconnecter et à se reconnecter. Lorsqu’elle est utilisée sans argument, elle suppose que vous voulez passer à l’utilisateur root (d’où la première interprétation du nom), mais vous pouvez lui passer un nom d’utilisateur afin de passer à un compte d’utilisateur spécifique (la deuxième interprétation). En encourageant l’utilisation de su, l’objectif était de persuader les administrateurs de passer la plupart de leur temps à utiliser un compte normal, de ne passer au compte de super-utilisateur que lorsqu’ils en avaient besoin, puis d’utiliser la commande logout (ou le raccourci Ctrl-D) dès que possible pour revenir à leur compte de niveau utilisateur.

En minimisant le temps passé à se connecter en tant que racine, l’utilisation de su réduit la fenêtre d’opportunité dans laquelle on peut faire une erreur catastrophique. Malgré cela, la nature humaine étant ce qu’elle est, de nombreux administrateurs se sont rendus coupables de laisser ouverts des terminaux fonctionnant depuis longtemps dans lesquels ils ont utilisé su pour passer au compte racine. À cet égard, su n’était qu’un petit pas en avant pour la sécurité.

N’utilisez pas su
Si quelqu’un vous demande d’utiliser su, méfiez-vous. Si vous utilisez Ubuntu, le compte racine est désactivé par défaut, donc su sans paramètres ne fonctionnera pas. Mais cela ne vaut toujours pas la peine de prendre le risque, au cas où le compte aurait été activé sans que vous vous en rendiez compte. Si on vous demande d’utiliser su avec un nom d’utilisateur, alors (si vous avez le mot de passe) vous aurez accès à tous les fichiers de cet utilisateur, et vous pourrez les supprimer ou les modifier accidentellement.

Lorsque vous utilisez su votre terminal, toute votre session est transférée à l’autre utilisateur. Les commandes qui ne nécessitent pas d’accès root, quelque chose d’aussi banal que pwd ou ls, seraient exécutées sous les auspices du super utilisateur, ce qui augmente le risque qu’un bug dans le programme ne cause des problèmes majeurs. Pire encore, si vous perdez la trace de l’utilisateur sous lequel vous travaillez, vous risquez de lancer une commande qui est assez bénigne lorsqu’elle est exécutée en tant qu’utilisateur, mais qui pourrait détruire tout le système si elle est exécutée en tant que root.

Il est préférable de désactiver entièrement le compte root et ensuite, au lieu d’autoriser des sessions de terminal de longue durée avec des pouvoirs dangereux, d’exiger que l’utilisateur demande spécifiquement des droits de super-utilisateur sur une base de commande. La clé de cette approche est une commande appelée sudo (comme dans “changer d’utilisateur et faire cette commande”).

sudo est utilisé pour préfixer une commande qui doit être exécutée avec des privilèges de super-utilisateur. Un fichier de configuration est utilisé pour définir quels utilisateurs peuvent utiliser sudo, et quelles commandes ils peuvent exécuter. Lorsqu’il exécute une commande de ce type, l’utilisateur est invité à saisir son propre mot de passe, qui est ensuite mis en cache pendant un certain temps (15 minutes par défaut), de sorte que s’il doit exécuter plusieurs commandes au niveau du super-utilisateur, il ne lui est pas continuellement demandé de le saisir.

Sur un système Ubuntu, le premier utilisateur créé lors de l’installation du système est considéré comme le super-utilisateur. Lors de l’ajout d’un nouvel utilisateur, il est possible de le créer en tant qu’administrateur, auquel cas il pourra également exécuter des commandes de super-utilisateur avec sudo. Dans cette capture d’écran d’Ubuntu 18.04, vous pouvez voir l’option en haut de la boîte de dialogue :

En supposant que vous soyez sur un système Linux qui utilise sudo, et que votre compte soit configuré en tant qu’administrateur, essayez ce qui suit pour voir ce qui se passe lorsque vous essayez d’accéder à un fichier considéré comme sensible (il contient des mots de passe cryptés) :

cat /etc/shadow
sudo cat /etc/shadow

Si vous entrez votre mot de passe lorsqu’on vous le demande, vous devriez voir le contenu du fichier /etc/shadow. Effacez maintenant le terminal en lançant la commande reset, et redémarrez sudo cat /etc/shadow. Cette fois, le fichier sera affiché sans vous demander votre mot de passe, car il est toujours dans le cache.

Attention au sudo
Si vous avez pour instruction d’exécuter un ordre avec sudo, assurez-vous de bien comprendre ce que fait l’ordre avant de continuer. L’exécution de sudo confère à cette commande les mêmes pouvoirs qu’un super-utilisateur. Par exemple, le site d’un éditeur de logiciels peut vous demander de télécharger un fichier et de modifier ses autorisations, puis d’utiliser sudo pour l’exécuter. Si vous ne savez pas exactement ce que fait le fichier, vous ouvrez un trou par lequel un logiciel malveillant pourrait potentiellement être installé sur votre système. sudo ne peut exécuter qu’une seule commande à la fois, mais cette commande pourrait elle-même en exécuter plusieurs autres. Traitez toute nouvelle utilisation de sudo comme étant tout aussi dangereuse que le fait de se connecter en tant que root.

Pour les instructions ciblant Ubuntu, une apparence courante de sudo est d’installer un nouveau logiciel sur votre système en utilisant les commandes apt ou apt-get. Si les instructions exigent que vous ajoutiez d’abord un nouveau dépôt de logiciels à votre système, en utilisant la commande apt-add-repository, en éditant des fichiers dans /etc/apt, ou en utilisant un “PPA” (Personal Package Archive), vous devez être prudent car ces sources ne sont pas conservées par Canonical. Mais souvent, les instructions vous demandent simplement d’installer des logiciels à partir des dépôts standards, ce qui devrait être sûr.

Installation de nouveaux logiciels
Il existe de nombreuses façons différentes d’installer des logiciels sur les systèmes Linux. L’installation directe à partir des dépôts de logiciels officiels de votre distribution est l’option la plus sûre, mais il arrive que l’application ou la version que vous souhaitez ne soit tout simplement pas disponible de cette façon. Lorsque vous installez par un autre mécanisme, assurez-vous que vous obtenez les fichiers d’une source officielle pour le projet en question.

Les indications que les fichiers proviennent de l’extérieur des dépôts de la distribution incluent (mais ne sont pas limités à) l’utilisation de l’une des commandes suivantes : curl, wget, pip, npm, make, ou toute instruction qui vous dit de modifier les permissions d’un fichier pour le rendre exécutable.

De plus en plus, Ubuntu utilise des “snaps”, un nouveau format de paquet qui offre quelques améliorations de sécurité en confinant plus étroitement les programmes pour les empêcher d’accéder aux parties du système dont ils n’ont pas besoin. Mais certaines options peuvent réduire le niveau de sécurité. Ainsi, si l’on vous demande d’exécuter snap install avec d’autres paramètres que le nom du snap, il vaut la peine de vérifier exactement ce que la commande essaie de faire.

Installons un nouveau programme en ligne de commande à partir des dépôts Ubuntu standard pour illustrer cette utilisation de sudo :

sudo apt install tree

Une fois que vous avez fourni votre mot de passe, le programme apt imprimera quelques lignes de texte pour vous dire ce qu’il fait. L’arborescence du programme tree est petite, donc le téléchargement et l’installation ne devraient pas prendre plus d’une minute ou deux pour la plupart des utilisateurs. Une fois que vous êtes revenu à l’invite normale de la ligne de commande, le programme est installé et prêt à être utilisé. Lançons-le pour avoir une meilleure vue d’ensemble de notre collection de fichiers et de dossiers :

cd /tmp/tutorial
tree

Pour revenir à la commande qui a effectivement installé le nouveau programme (sudo apt install tree), elle est légèrement différente de celles que vous avez vues jusqu’à présent. En pratique, cela fonctionne ainsi :

  1. La commande sudo, lorsqu’elle est utilisée sans aucune option, suppose que le premier paramètre est une commande permettant de l’exécuter avec des privilèges de super-utilisateur. Tous les autres paramètres seront passés directement à la nouvelle commande. Les commutateurs de sudo commencent tous par un ou deux traits d’union et doivent suivre immédiatement la commande sudo, de sorte qu’il ne peut y avoir de confusion quant à savoir si le deuxième paramètre sur la ligne est une commande ou une option.
  2. Dans ce cas, la commande est apt. Contrairement aux autres commandes que nous avons vues, elle ne fonctionne pas directement avec les fichiers. Elle s’attend plutôt à ce que son premier paramètre soit une instruction d’exécution (install), les autres paramètres variant en fonction de l’instruction.
  3. Dans ce cas, la commande install indique à apt que le reste de la ligne de commande consistera en un ou plusieurs noms de paquets à installer à partir des dépôts de logiciels du système. Habituellement, cela ajoutera de nouveaux logiciels à la machine, mais les paquets peuvent être n’importe quel ensemble de fichiers qui doivent être installés à des endroits particuliers, tels que des polices ou des images de bureau.

Vous pouvez mettre sudo devant n’importe quelle commande pour l’exécuter en tant que super-utilisateur, mais il est rarement nécessaire de le faire. Même les fichiers de configuration du système peuvent souvent être consultés (avec cat ou less) comme un utilisateur normal, et ne nécessitent les privilèges de root que si vous avez besoin de les modifier.

Méfiez-vous des sudo su
Une astuce avec sudo est de l’utiliser pour exécuter la commande su. Cela vous donnera un shell root même si le compte root est désactivé. Cela peut être utile lorsque vous devez exécuter une série de commandes en tant que super-utilisateur, pour éviter d’avoir à les préfixer toutes avec sudo, mais cela vous ouvre exactement le même genre de problèmes que ceux décrits pour su ci-dessus. Si vous suivez des instructions vous indiquant d’exécuter sudo su, sachez que chaque commande suivante sera exécutée en tant que super-utilisateur.

Dans cette section, vous avez appris les dangers du compte racine et comment les systèmes Linux modernes comme Ubuntu tentent de réduire le risque de danger en utilisant sudo. Mais toute utilisation des pouvoirs de super-utilisateur doit être envisagée avec prudence. En suivant les instructions que vous trouvez en ligne, vous devriez être mieux à même de repérer les commandes qui pourraient nécessiter un examen plus approfondi.

Fichiers cachés

Avant de conclure ce tutoriel, il convient de mentionner les fichiers (et dossiers) cachés. Ceux-ci sont couramment utilisés sur les systèmes Linux pour stocker les paramètres et les données de configuration, et sont généralement cachés simplement pour ne pas encombrer la vue de vos propres fichiers. Un fichier ou un dossier caché n’a rien de spécial, si ce n’est son nom : il suffit de commencer un nom par un point (“.”) pour le faire disparaître.

cd /tmp/tutorial
ls
mv combined.txt .combined.txt
ls

Vous pouvez toujours travailler avec le fichier caché en veillant à inclure le point lorsque vous spécifiez son nom de fichier :

cat .combined.txt
mkdir .hidden
mv .combined.txt .hidden
less .hidden/.combined.txt

Si vous lancez ls, vous verrez que le répertoire .hidden est, comme vous pouvez vous y attendre, caché. Vous pouvez toujours lister son contenu en utilisant ls .hidden, mais comme il ne contient qu’un seul fichier qui est lui-même caché, vous n’obtiendrez pas beaucoup de résultats. Mais vous pouvez utiliser le commutateur -a (show all) sur ls pour qu’il affiche tout dans un répertoire, y compris les fichiers et les dossiers cachés :

ls
ls -a
ls .hidden
ls -a .hidden

Remarquez que les raccourcis que nous avons utilisés précédemment, . et .., apparaissent également comme de véritables répertoires.

Quant à notre commande tree récemment installée, elle fonctionne de la même manière (sauf qu’elle n’est pas affichée par . et ..) :

tree
tree -a

Retournez à votre répertoire d’origine (cd) et essayez d’exécuter ls sans puis avec le commutateur -a. Passez la sortie par wc -l pour vous donner une idée plus précise du nombre de fichiers et de dossiers cachés qui se trouvaient sous votre nez pendant tout ce temps. Ces fichiers stockent généralement votre configuration personnelle, et c’est ainsi que les systèmes Unix ont toujours offert la possibilité d’avoir des paramètres de niveau système (généralement dans /etc) qui peuvent être écrasés par les utilisateurs individuels (grâce aux fichiers cachés dans leur répertoire d’origine).

En général, vous ne devriez pas avoir à vous occuper de fichiers cachés, mais il peut arriver que des instructions vous obligent à faire un cd dans le fichier .config, ou à modifier un fichier dont le nom commence par un point. Au moins maintenant, vous comprendrez ce qui se passe, même si vous ne pouvez pas voir facilement le fichier dans vos outils graphiques.

Nettoyage

Nous avons atteint la fin de ce tutoriel, et vous devriez être de retour dans votre répertoire personnel maintenant (utilisez pwd pour vérifier, et cd pour y aller si vous n’y êtes pas). Il est poli de laisser votre ordinateur dans le même état que celui dans lequel nous l’avons trouvé, donc pour finir, supprimons la zone d’expérimentation que nous utilisions auparavant, puis vérifions qu’elle a bien disparu :

rm -r /tmp/tutorial
ls /tmp

En dernier lieu, fermons le terminal. Vous pouvez simplement fermer la fenêtre, mais il est préférable de se déconnecter de la coquille. Vous pouvez utiliser soit la commande logout, soit le raccourci clavier Ctrl-D. Si vous prévoyez d’utiliser souvent le terminal, en mémorisant Ctrl-Alt-T pour lancer le terminal et Ctrl-D pour le fermer, vous aurez bientôt l’impression d’avoir un assistant pratique que vous pourrez appeler instantanément, et que vous pourrez renvoyer tout aussi facilement.

Conclusion

Ce tutoriel n’a été qu’une brève introduction à la ligne de commande Linux. Nous avons examiné quelques commandes courantes pour se déplacer dans le système de fichiers et manipuler des fichiers, mais aucun tutoriel ne peut espérer fournir un guide complet de toutes les commandes disponibles. Le plus important est que vous ayez appris les principaux aspects du travail avec l’interpréteur de commandes. Vous avez été initié à une terminologie largement utilisée (et à des synonymes) que vous pourriez rencontrer en ligne, et vous avez acquis un aperçu de certaines des parties clés d’une commande shell typique. Vous avez appris les chemins d’accès absolus et relatifs, les arguments, les options, les pages de manuel, sudo et root, les fichiers cachés et bien plus encore.

Grâce à ces concepts clés, vous devriez pouvoir donner plus de sens à toutes les instructions de la ligne de commande que vous rencontrez. Même si vous ne comprenez pas chaque commande, vous devriez au moins avoir une idée de l’endroit où une commande s’arrête et où la suivante commence. Vous devriez être plus facilement en mesure de savoir quels fichiers ils manipulent, ou quels autres interrupteurs et paramètres sont utilisés. En vous référant aux pages de manuel, vous pourriez même glaner exactement ce que fait la commande, ou au moins en avoir une idée générale.

Nous n’avons pas abordé ici les éléments susceptibles de vous faire abandonner votre gestionnaire de fichiers graphiques au profit d’un prompt, mais la manipulation des fichiers n’était pas vraiment l’objectif principal. Si, toutefois, vous êtes intrigué par la possibilité d’affecter des fichiers dans des parties disparates de votre disque dur en appuyant sur quelques touches seulement, vous avez encore beaucoup à apprendre.

Lectures complémentaires

Il existe de nombreux tutoriels en ligne et des livres publiés commercialement sur la ligne de commande, mais si vous souhaitez approfondir le sujet, un bon point de départ pourrait être le livre suivant :

La raison pour laquelle nous recommandons ce livre en particulier est qu’il a été publié sous une licence Creative Commons et qu’il peut être téléchargé gratuitement sous forme de fichier PDF, ce qui le rend idéal pour le débutant qui ne sait pas exactement combien il veut s’engager à la ligne de commande. Il est également disponible sous forme de volume imprimé, au cas où vous seriez pris par le bogue de la ligne de commande et que vous souhaiteriez une référence papier.