S1C3 Commandes Linux de base

SIO > S1_Commun > S1C3_Langage de commande > S1C3_LINUX_2_commandes.md

Introduction

La ligne de commande a été vue dans Les commandes DOS. Ce cour doit être vu avant de lire celui-ci.

Petit rappel : la ligne de commande permet de faire beaucoup de gestion du système Linux (beaucoup plus que pour DOS).
Il est donc impératif de connaître les mécanismes des commandes de base vues ici, comme par exemple :

[bash]
 mkdir toto    // créer le répertoire toto
 cd toto       // changer de répertoire et aller dans toto/
 ls            // afficher la liste des objets contenus dans toto/ (dir fonctionne aussi ... )
 echo "coucou" // afficher le texte écrit

En fin de ce document, Il y a des exemples et exercices expliqués. A voir.

Linux et distribution : Linux propose au minimum un panel de commandes associées à l'interpréteur de shell utilisé.
Nous utilisons le Bourne Again Shell ou Bash.
Cependant, Lunix n'est pas fait d'une seule pièce mais est un patchwork d'une multitude de progrmme élaborés par autant d'éditeurs, d'auteurs différents.
Donc, même si il existe une tendance à l'uniformisation des comportements des commandes, certaines commandes sont gérées différemment de ce qui suit.
Il convient de s'adapter à chacune.
À noter qu'il existe aussi d'autres langages shells : Almquist shell (ash), C shell (csh), dash, ksh, zsh, fish, ...

Les commandes suivantes sont à apprendre selon la priorité : +++ = impérative, ++ = très utile, + = à connaître, - = peuvent se retrouver mais les connaître facilite la vie.

Noms des fichiers utilisés dans les commandes (+++)

Les noms sont écrits soit avec un chemin relatif, soit un chemin absolu. Noter que le nom du disque n'eststepas, nous n'avons qu'une seule racine !
Pour représenter plusieurs fichiers en une seuls fois, on peut utiliser des jokers : ? ou *.

Exemples
[bash]
ls           # lister tous les objets du dossier
ls test.txt  # lister l'objet demandé
ls test.*    # idem, nommés test, peu importe leur extension : test.txt, test.doc, test/, etc...
ls te?t.txt  # idem, dont le nom débute par te suivi d'un car. et terminé par t : test.txt, text.txt, teat.txt, ...
ls test*.txt # idem, dont le nom débute par test : test.txt, test1.txt, test2.txt, test abcdexxx123.txt, ...
ls test?.txt # idem, dont le nom débute par test suivi d'un seul car : test1.txt, test2.txt ; mais pas test.txt ni testxyz.txt, ...

Rem : car = caractère.
Noter que la syntaxe est identique au DOS ! Seule différence, l'extension est optionnelle

Répertoires (+++)

Commande Description Exemple
man aide sur une commande man ls, man dir, parfoir commande ? ou commande -help
ls Afficher le contenu d'un répertoire. -l affichage en liste détaillée, -a affichage des objets cachés ls /home/toto/
dir Alias de ls
cd Changer de répertoire. ~ = rep home de l'utilisateur, - = rep précédent, .. = rep parent cd /home/toto ; cd ~ ; cd - ; cd ..
mkdir Créer un répertoire (make directory) mkdir tutu
rmdir Supprimer un répertoire non vide (remove directory) rmdir tutu
pwd Afficher le chemin complet du répertoire courant (savoir où on est)

Des options permettent de changer le comportement de certaines commandes. Voir dans l'aide (man) pour plus de détails.

Fichiers (+++)

Commande Description Exemple
grep (+++) rechercher des lignes dans le contenu d'un fichier ou le résultat d'une commande (voir aide de la commande) grep "toto" liste.text
chmod (+++) (change mode) modifier les permissions d'un fichier (DOS : attrib) chmod 744 liste.text
chown (+++) (change owner) changer le propriétéaire de l'objet, -R= récursif chown -R www-data /var/www/html/applitest
cp (+++) copier un fichier (plusieurs en utilisant les jokers * ou ?) (DOS = copy) cp FTP/*.* FTP_SAV/
mv ou move (+++) déplacer ou/et renommer un fichier ou répertoire mv toto.text toutou.text
rm (+++) (remove) Supprimer un fichier ou répertoire (…) (plusieurs en utilisant les jokers ou ?) rm FTP_SAV/*.*
tail (++) Afficher la fin d'un fichier tail -5 liste.text # 5 dernières lignes
more (++) Afficher le contenu d'un fichier texte page par page dir | more
cat (++) Afficher le contenu d'un fichier texte cat liste.text
find (+) Chercher un fichier dans l'arborescence find ./ -name "liste.text"
touch (-) créer un fichier vide et bien d'autres choses toutch new_liste.text
head (-) Afficher le début d'un fichier
less (-) Afficher le contenu d'un fichier texte en avant et arrière less liste.text
whoami (Qui suis-je ?) Afficher le nom de l'utilisateur courant
wich Afficher le chemin d'une commande shell wich python
whatis (Qu'est-ce que ... ?) Afficher une description d'une commande whatis python

Des options permettent de changer le comportement de certaines commandes. Voir dans l'aide (man) pour plus de détails.

Pour exécuter un fichier shell (.sh), faire précéder le ficher par ./ : ./monscript.sh

Les commandes système (+)

Commande Description
date (+) Afficher/changer la date système (du BIOS)
time (+) Afficher/changer l'heure système (du BIOS)
exit sortir de l'invite de commande (et fermer la fenêtre)
shutdown now Éteindre la machine
halt Arrêter la machine sans l'éteindre. l'appui d'un touche la relance
reboot Redémarrer la machine.
kill Arrêter le processus indiqué par son PID (process ID) ou son nom binaire. Avec l'option -9, arrêt immédiat
history Afficher l'historique des commandes
adduser ajouter un nouvel utilisateur
useradd ajouter un nouvel utilisateur
passwd changer le mot de passe

Voici une palette de quelques commandes utiles et utilitaires en ligne de commande :

Commande Description
top, htop utilitaire d'affichage des processus (Win : taskmgr)
ps utilitaire d'affichage des processus de la session courante (TTY)

Utilitaires divers (+++)

apt Gestionnaire de paquets (i.e. de logiciels téléchargés)
yum, pacman, git Gestionnaires alternatifs de paquets (i.e. de logiciels téléchargés)(*)
wget Gestionnaires téléchargement web (*)
unzip utilitaire de décompression de fichiers zip (*)
tar utilitaire de décompression de fichiers tar et gz
nano Éditeur de texte plus convivial que vi ou vim

(*) logiciel à télécharger et installer

Les commandes réseau (+++)

Commande Description
ping, Envoyer une requête ICMP pour tester la communication réseau
ifconfig ou ip a Afficher la configuration du réseau ; ip : voir les options
netstat (+) (obsolète) Afficher l'état des communications réseau, des connexions
arp (+) (obsolète) Afficher la table ARP locale ; gérer la table ARP
ss (+++) (new) Afficher différents rapports sur l'état du réseau

Il existe d'autres commandes moins utiles ou spécifiques. Utiliser la commande help dans l'invite de commande pour les afficher.

Entrées/sorties et redirections (+++)

Comme en DOS, les entrées sorties (E/S ou I/O) sont au nombre de trois :

  • entrée standard 0 : par défaut : le clavier.
  • sortie standard 1 : le flux de réussite normal de la commande, par défaut vers l'écran
  • sortie standard 2 : flux d'echec, d'erreur de la commande , vers l'écran par défaut

Cependant, il est possible de détourner ces I/O avec des redirections d'entrées/sorties comme en DOS.

Redirection des E/S

Même Comportement qu'en DOS Les redirections sont :

Commande Description Exemple
> Rediriger le résultat d'une commande vers un fichier. L'éventuel contenu existant est écrasé, remplacé intégralement. dir > fichier.txt
&1> Rediriger le résultat du flux de réussites d'une commande. ls > fichier.txt
&2> Rediriger le résultat du flux d'erreur d'une commande. ls &1> fichier.txt &2>fichier.log
>> Rediriger le résultat d'une commande vers un fichier en l'ajoutant à la fin du contenu existant. ls toto/ >> fichier.txt
| Rediriger le résultat d'une commande vers un seconde commande. ls | more ; affiche le résultat de ls page/page avec possibilité de navigation arr/avt
< peu courant Rediriger un ficher vers l'entrée d'une commande. Se fait par redirection inverse. sort < liste.txt ; affiche le résultat du tri des lignes du fichier
Comprendre les sorties standard.

En réalité, les sorties standard se comporte comme un fichier qui serait affiché ligne par ligne.
Il est donc dès lors facile de comprendre que la commande du tube ressemble à un fichier intermédiaire. La commande :

[bash]
 ls -l | grep "log"  # grep affiche les lignes correspondantes parmi le résultat de ls /b

Effectue la même chose que les commandes successives :

[bash]
 ls -l > temp.text       # ls -l est enregistrée dans un fichier temp
 grep "log"  < temp.text # grep cherche les lignes correspondantes dans le fichier temp et les affiche

Commandes spécialisées pour les batchs shell simples

Les variables

Les variables sont plus simples à définir, pas de commande spécifiques : maVariable = "une valeur de type chaine".

Code structuré

Ici aussi, on retrouve des commandes de script classiques, a ceci près que le mot clé de fin est le motclé de départ à l'envers (sauf exception, comme d'hab') :

Commande Description
\# bla bla bla commentaire sur une seule ligne
echo affichage de contenu
read lecture du clavier ou d'un fichier
if [test] then ... else ... fi alternative
case ... esac alternative multiple
while ... done Afficher le contenu du répertoire distant
export rendre la variable exportée disponible en dehors du shell concerné et donc accessibla aux autres shells

Exemple : soit un fichier contenant les lignes suivantes :

 toto Totoro Miyazaki
 titi Titeuff Chappuis
 tata Taram Alexander

Le code ci-dessous crée le répertoire pour chaque utilisateur et y insère un fichier html contenant le texte html : "<html><h1>bienvenue chez xxx</h1></html>".

[bash]
# Définir le nom du fichier 
fichier = "liste.text"
 
# Tester si le fichier est absent, sortie en erreur (1)
if [ ! -e $fichier ]
then
  echo "Le fichier $fichier n'existe pas, script interrompu !"
  exit 1
fi
 
# Traitement si le fichier est présent
grep -v '^\#' $fichier | while true   # lire le fichier
  read ligne
  # Si la ligne est vide, on s'arrête
  if [ "$ligne" = "" ]
  then
    echo "  =| fin du fichier des utilisateurs"
    break
  fi
  # Affectation des champs lus à des variables
  repertoire=$1
  prenom=$2
  nom=$3
  # Si le répertoire existe, on passe au suivant, sinon, on crée le répertoire et le fichier
  if [ -d "FTP/Users/$repertoire" ]
  then
    echo "le repertoire $repertoire existe deja"
  else
    mkdir FTP/Users/$repertoire
	echo "<html><h1>Bonjour $prenom $nom</h1></html>" > FTP/Users/$repertoire
  fi
 done # fin de la lecture
 
# Fin du traitement

Références