Mise à jour du 02/06/2024.
Linux est un système d'exploitation dérivé des systèmes UNIX existants (années 70). Initialement adapté aux PC (architecture Intel), il a été transposé désormais pour de nombreux autres processeurs dont les processeurs RISC (ARM, Alpha, etc.). C'est aussi sur un noyau de ce système qu'est réalisé le système Android. Mis à part la simplicité de mise en œuvre et la gestion graphique, il est plus efficace que les systèmes Windows sur la plupart des autres points. "Sources libres" et absence de coût d'acquisition ont fait de ce système celui des plates-formes professionnelles notamment côté "serveur" (dont les clouds). Son interpréteur de commandes puissant permet son utilisation à distance depuis un simple terminal. Cette faculté le rend incontournable en présence de liaison à faible débit. Ce mode terminal est d'autant plus appréciable qu'il permet d'exécuter de puissants langages de scripts comme Perl ou Python.
L'utilisateur habitué aux environnements graphiques est souvent dérouté par l'utilisation de telles commandes car elles imposent un apprentissage. Ici, il n'est plus question de s'en remettre aux clics souris plus ou moins heureux pour découvrir de façon "intuitive" la fonction "miracle" dont on a besoin : il faut apprendre ! Un autre fait nuit à la généralisation de ce système : les "distributions". Une distribution est une reprise du noyau par une communauté de développeurs qui le personnalise en l'entourant d'outils et de procédures. Heureusement (ou pas car c'est une preuve de son manque de généralisation), le nombre de distributions a chuté de façon drastique dans les années 90.
Les principales distributions libres sont aujourd'hui :
Un point de différenciation important entre les distribution est la gestion des paquets constituant la distribution. Outre le recensement des logiciels, cette gestion permet d'éviter les incompatibilités de librairies et leurs conflits. Il existe aujourd'hui deux grands systèmes de gestion : RPM (Fedora, OpenSuse) et APT (Debian, Ubuntu). Il existe donc des commandes propres à ces deux systèmes. En tant que référence, nous nous limiterons aux commandes Debian mais elles ont toutes leur équivalent dans l'autre système. Sous Debian, la gestion des paquets utilise 3 sortes d'outils : aptitude, apt et dpkg. aptitude est un logiciel texte semi-graphique qui exécute l'ensemble des commandes. Il n'est toutefois pas très intuitif et peut amener à de gros dégâts si les concepts sur lesquels il repose ne sont pas maîtrisés. Pour notre part, nosu utilsons exclusivement apt.
Le but de cet article est de recenser les commandes usuelles ou très spécifiques de ce système.
| Commande. | Description. |
|---|---|
| host -t MX {domaine} | Recherche du nom d'hôte de la machine qui supporte le serveur de messagerie d'un domaine donné. |
| postqueue -p | Lecture de la queue d'ettente des messages à émettre d'un serveur Postfix. |
| postqueue -f | Force l'émission des messages de la queue d'attente d'un serveur Postfix. |
| postfix reload | Force le rechargement du fichier de configuration mainf.cf du serveur Postfix sans avoir à l'arrêter. |
| postsuper -d {ID dans la queue} | Force la suppression du message d'identifiant donné de la queue. |
| postsuper -p | Purge des fichiers temporaires après un crash du système. |
| adduser [--disabled-login] [--ingroup {group the account belongs to}] [--no-create-home] {compte} | Création avec options d'un compte utilisateur Linux. |
| dpkg-getselections | Lecture des paquets Linux installés (système APT uniquement). |
| apt-cache --names-only search {masque de recherche} | Cherche dans les dépôts déclarés (/etc/apt/sources.list) les paquets dont le nom répond à un masque de recherche donné (DVD ou miroir ren ligne). |
| apt-get install {paquet 1}[ {paquet i}] | Installation d'un ou plusieurs paquets. |
| apt-get remove {paquet} | Suppression d'un paquet. |
| apt-get purge {paquet} | Suppression d'un paquet et de toute ses traces. |
| apt-get autoremove | Suppression des paquets inutiles. |
| apt-get dist-upgrade | Mise à jour des paquets de la distribution. Si la listed es dépôts a été modifiée (/etc/apt/sources.list), il convient d'invoquer apt-get update au préalable. |
| apt-cache show {paquet} | Obtient le détail du contenu d'un paquet. |
| dpkg -L | Liste les fichiers d'un paquet installé. |
| find {chemin} -depth | Liste les sous-répertoires. Les résultats sont relatifs au chemin courant. Si {chemin} est absolu, le résultat sera une liste de chemins absolus. |
| lsb_release -a | Donne la version de la distribution (ne fonctionne pas avec toutes les distributions). |
| vmstat -s | Utilisation de la mémoire vive. |
| dmidecode --type memory | Détecte la quantité de mémoire vive installée. |
| ip link show | Liste les interfaces réseau. |
| bklid | Liste les UUID des partitions du système y compris celles non montées. |
| grep install /var/log/dpkg.log (Debian) ou rpm -qa --last (Red hat, OpenSuse, etc.) | Liste les GDH d'installation des paquets (utiles en cas de suspicion de rootkits par exemple). |
| w | Liste des utilisateurs connectés. |
| last | Liste des dernières connexions des utilisateurs. |
| arch | Architecture du système. |
| lastlog | Liste les dernières connexions de chaque utilisateur du système. |
| lsof | Liste des descripteurs de fichiers (au sens UNIX) ouverts. |
| free | Etat des mémoires. |
| procinfo | Donne des informations sur le système à partir des pseudo-fichiers. |
| lsdev | Liste des périphériques. |
| dmesg | Liste des messages au boot du système. |
| netstat | Liste des ports et protocoles de communication en cours. |
| route | Indique les différents nœuds traversés pour joindre la station distante. |
| lsblk | Affichage des périphériques en mode "bloc" (média de type disque). |
| df | Affichage des partitions. |
| mkfs.vfat {partition ex: /dev/sdb1} | Formatage de la partition (non montée) en FAT32. |
| swapon -s | Affichage de l'état d'occupation de la partition d'échange (swap). |
| swapoff -a | Arrêt et purge de la partition d'échange (swap). |
| udisksctl mount -b /dev/xxx | Montage d'un périphérique de type bloc (clef USB par exemple) sans droits root. |
| grep -rnw {chemin racine de la recherche} -e {masque de recherche} | Recherche d'une chaîne dans les fichiers situés sur et sous un répertoire. Pour les fichiers texte, les résultats de la commande précise les N° de ligne où on trouve la chaîne. |
| dpkg-configure console-setup | Paramètrage de l'affichage console (et non des applications de type terminal). |
| journalctl -b [[ID][±offset]|all] | Afficher les messages d'un démarrage spécifique. L'argument peut être vide, auquel cas les journaux du démarrage en cours seront affichés. Si l'ID de démarrage est omis, un offset positif on recherchera les démarrages à partir du début du journal, et si l'offset est égal ou inférieur à zéro on recherchera les démarrages à partir de la fin du journal. Ainsi, 1 est le premier démarrage trouvé dans le journal par ordre chronologique, 2 le deuxième et ainsi de suite ; tandis que -0 est le dernier démarrage, -1 l'avant-dernier démarrage, et ainsi de suite. Un offset vide équivaut à spécifier -0, sauf lorsque le démarrage en cours n'est pas le dernier démarrage (par exemple parce que l'arguement --directory a été spécifié pour consulter les journaux d'une autre machine). Si l'ID de 32 caractères estt spécifié, il peut éventuellement être suivi de offset qui identifie le démarrage par rapport à celui donné par boot ID. Les valeurs négatives signifient des démarrages plus précoces et les valeurs positives signifient des démarrages plus tardifs. Si offset n'est pas spécifié, une valeur de zéro est supposée et les journaux du démarrage donnés par ID sont affichés. (cf. man journalctl) |
| journalctl -u UNIT|PATTERN | Affichage des traces d'un service ou d'un groupe de services gérés par systemd (unit). (cf. man journalctl) |
| journalctl -g PATTERN | Filtrage des traces qui contiennent le masque spécifié (PATTERN expression régulière compatible PERL). Utilisé par exemple pour isoler des traces contenant des préfixes de journalisation fixés par iptables. (cf. man journalctl) |
| journalctl --list-boots | Affichage de la liste des traces de démarrage (1 seule ligne) avec leur ID. (cf. man journalctl) |
| journalctl --vacuum-time|--vacuum-size|vaccum-file | Purge des traces de systemd en fonction d'un instant, d'une taille ou d'un fichier. (cf. man journalctl) |
| gdu | Affichage du taux d'occupation du système de fichier en mode console semi-graphique. |
| deborphan | Recherche des paquets dont aucun autre paquet ne dépend. Par défaut, la recherche est effectuée dans les sections libs, oldlibs et introspection pour traquer les bibliothèques inutilisées. Si une liste de paquets lui est passée en paramètre, seules les dépendances sur ces paquets seront recherchées. Le résultat de la recherche est envoyé sur la sortie standard comme si l'option --show-deps lui avait été passée. La recherche à partir de paquets passés en paramètre listera tous les paquets trouvés, sans tenir compte de leur priorité. La valeur - permet de transmettre les paquets sur l'entrée standard. |
| arp-scan --localnet | Analyse des adresses MAC d'un réseau local avec adresse IP correspondante. |
| lsscsi | Liste les périphériques SCSI an précisant leur type et leur chemin de périphérique. |
| hwinfo | Dresse la cartographie matérielle de la machine et l'affiche sur la console. |
| iptstate | Liste les connexions IP actives à la manière de top. |
| nfswatch | Surveillance NFS console. |
| partclone | Création de l'image d'une parition. |
| sleuthkit | Analyse de disque (forensic). |
| sockstat | Liste des sockets. |
| apt-file search /usr/lib/python3/dist-packages/{module} | Recherche du paquet Debian contenant un module python de nom donné. |
| openssl s_client -connect {hôte}:{port d'écoute} | Lecture des données d'un certificat associé à un serveur : exemple openssl s_client -connect smtp.free.fr:465. |
| openssl s_client -showcerts -connect {hôte}:{port d'écoute} | Lecture des données des certificats composant la chaîne de certification associée à un serveur : exemple openssl s_client -showcerts -connect smtp.free.fr:465. |
| openssl x509 -in {fichier certificat} -noout -text | Lecture des données d'un certificat contenu dans un fichier au format PEM : exemple openssl x509 -in /etc/ssm/certs/smtp.free.fr -noout -text. |
Un des points de performances des UNIX et donc de Linux sur d'autres systèmes et son puissant et généralisé mécanisme de redirection. Il est ainsi possible de combiner la "sortie" d'une commande (les résultats qu'elle produit) aux "entrées" (les paramètres attendus) de la commande qui suit. Toutes les commandes intégrables à un script peuvent être re-dirigées. Cela se fait en plaçant le symbole '|' (pipe : ASCII 124) entre les deux commandes. Les commandes combinées agissent comme une commande unique.
Par exemple la commande wc -l /var/log/apache2/access.log | tee /tmp/access.linescompte le nombre de lignes du journal du serveur Web Apache, l'affiche à l'écran et enregistre ce nombre dans un fichier. Le tableau qui suit dresse quelques exemples utiles.
| Commandes combinées. | Description. |
|---|---|
| cat {fichier journal apache access.log} | cut -f1 -d- | sort | uniq -c | Affiche le nombre de hits d'une adresse IP qui a joint le serveur Web Apache. |
| cat /proc/version | Donne des informations sur le noyau et éventuellement la distribution. |
| cat /etc/issue | Donne des informations sur la distribution (ne fonctionne pas avec toutes les distributions). |
| dmesg | head -1 | Donne des informations sur la distribution (ne fonctionne pas avec toutes les distributions). |
| aspell --lang {lang} dump master | aspell --lang {lang} expand | tr ' ' '\n' > {lang}.dic | Dresse la liste des mots d'une langue donnée ({lang}). En remplaçant {lang} par fr, cela donne les mots en français. Un tel dictionnaire est directement intégrable à certains outils comme IntelliJ. |
| cat /sys/power/state | Affiche les états possibles du système (souvent free, mem et disk). |
| echo -n mem > /sys/power/state | Met le système en veille (doit disposer des droits root). |
| echo -n disk > /sys/power/state | Met le système en hibernation (doit disposer des droits root). |
| ps aux | grep 'Z' | Affichage des processus "zombie". |
| pstree -p -s <PID> | Dresse la filiation d'un processus donné par son PID (utile pour tuer les "zombies" lorsque le parent peut l'être). |
| swappoff -a && swapon -a | Purge de la partition d'échange. Nécessite suffisamment de mémoire vive pour l'arrêt de la partition d'échange (swap) sinon la commande swapoffretourne une erreur. |
Il est souvent utile de lancer une application à partir d'un script. Cela est particulièrement utile lorsque des applications utilisent des librairies partagées dont plusieurs versions différentes existent sur la machine. Le script permet souvent de fixer l'environnement d'exécution comme la variable LD_LIBRARY_PATH. La difficulté est que l'application peut recevoir un nombre variable d'arguments. Dès lors, comment transmettre cette liste variable reçu par le script à l'application ou à l'autre script ?
Il existe des variables particulières dans bash pour manipuler les arguments et dont voici un tableau est les significations :
| $# | Nombre de paramètres transmis à la ligne de commande. |
| $? | Code du status d'exécution d'une commande (ou d'un script ou d'une application). |
| $@ | Liste des paramètres transmis à la ligne de commande. |
Pour revenir à notre problème initial, il suffit de transmettre $@ en tant que paramètre du second processus pour lui transmettre l'intégralité des paramètres reçus par la ligne de commande.
Notez que la variable $@ est égalemen très utile pour exécuter une boucle sur les paramètres reçus. Voic un exemple qui affiche la liste des paramètres reçus :
for PARAM in "$@" do echo "$PARAM" done
A partir du moement où un compte se voit affecter du groupe sudo, il accède aux droits root sur toutes les commandes après avoir fourni son mot de passe. La commande pour affecter le groupe sudo à un compte est : usermod -a -G sudo {compte}.
Dans la mesure où la sécurité n'est pas engagée, il est possible d'éviter la saisie de ce mot de passe. Pour cela, taper la commande sudo visudo pour entrer dans un éditeur de texte. Ajouter en dernière ligne{compte} ALL=(ALL) NOPASSWD:ALL.
Le premier ALL entre parenthèses indique les comptes dont les droits seront accordé. ALL signifie que l'utilisateur {compte} pourra prendre les droits de n'importe quel compte. On peut remplacer ALL par root ou un compte ou une liste de comptes séparés par une virgule.
Le dernier ALL indique la liste des programmes autorisés à s'exécuter avec les droits des comptes substitués. Il est possible de remplecr ce ALL par une liste d'exécutables séparés par une virgule.
En fait la configuration de sudo peut être suffisamment complexe pour atteindre le niveau de granularité souhaité en matière de sécurité. Pour en savoir plus tapez man sudoers.
Enfin, pour que vos modifications fassent effet immédiatement après la modification du fichier /etc/sudoers tapez la commande sudo sudo -Vou sudo -V | grep env.
Rédaction par Jean-Marie Piatte (1983-2021)