Portail / Linux(Sommaire)

Commandes Linux.

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.

Point sur les distributions.

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.

Commandes Linux utiles.

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 -pLecture de la queue d'ettente des messages à émettre d'un serveur Postfix.
postqueue -fForce l'émission des messages de la queue d'attente d'un serveur Postfix.
postfix reloadForce 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 -pPurge 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-getselectionsLecture 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 autoremoveSuppression des paquets inutiles.
apt-get dist-upgradeMise à 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 -LListe les fichiers d'un paquet installé.
find {chemin} -depthListe 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 -aDonne la version de la distribution (ne fonctionne pas avec toutes les distributions).
vmstat -sUtilisation de la mémoire vive.
dmidecode --type memoryDétecte la quantité de mémoire vive installée.
ip link showListe les interfaces réseau.
bklidListe 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).
wListe des utilisateurs connectés.
lastListe des dernières connexions des utilisateurs.
archArchitecture du système.
lastlogListe les dernières connexions de chaque utilisateur du système.
lsofListe des descripteurs de fichiers (au sens UNIX) ouverts.
freeEtat des mémoires.
procinfoDonne des informations sur le système à partir des pseudo-fichiers.
lsdevListe des périphériques.
dmesgListe des messages au boot du système.
netstatListe des ports et protocoles de communication en cours.
routeIndique les différents nœuds traversés pour joindre la station distante.
lsblkAffichage des périphériques en mode "bloc" (média de type disque).
dfAffichage des partitions.
mkfs.vfat {partition ex: /dev/sdb1}Formatage de la partition (non montée) en FAT32.
swapon -sAffichage de l'état d'occupation de la partition d'échange (swap).
swapoff -aArrêt et purge de la partition d'échange (swap).
udisksctl mount -b /dev/xxxMontage 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-setupParamè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|PATTERNAffichage des traces d'un service ou d'un groupe de services gérés par systemd (unit).
(cf. man journalctl)
journalctl -g PATTERNFiltrage 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-bootsAffichage de la liste des traces de démarrage (1 seule ligne) avec leur ID.
(cf. man journalctl)
journalctl --vacuum-time|--vacuum-size|vaccum-filePurge des traces de systemd en fonction d'un instant, d'une taille ou d'un fichier.
(cf. man journalctl)
gduAffichage du taux d'occupation du système de fichier en mode console semi-graphique.
deborphanRecherche 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 --localnetAnalyse des adresses MAC d'un réseau local avec adresse IP correspondante.
lsscsiListe les périphériques SCSI an précisant leur type et leur chemin de périphérique.
hwinfoDresse la cartographie matérielle de la machine et l'affiche sur la console.
iptstateListe les connexions IP actives à la manière de top.
nfswatchSurveillance NFS console.
partcloneCréation de l'image d'une parition.
sleuthkitAnalyse de disque (forensic).
sockstatListe 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 -textLecture 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.

Combinaisons de commandes (pipe)

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 -cAffiche le nombre de hits d'une adresse IP qui a joint le serveur Web Apache.
cat /proc/versionDonne des informations sur le noyau et éventuellement la distribution.
cat /etc/issueDonne des informations sur la distribution (ne fonctionne pas avec toutes les distributions).
dmesg | head -1Donne 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/stateAffiche les états possibles du système (souvent free, mem et disk).
echo -n mem > /sys/power/stateMet le système en veille (doit disposer des droits root).
echo -n disk > /sys/power/stateMet 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 -aPurge 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.

Procédures pariculières.

Transmettre une liste de paramètres d'un script à un autre processus.

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

Droits root via la commande sudo.

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)