From ea8743762c778fb3825afab0aab8a8d5157a0c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9drix?= Date: Sat, 16 May 2026 23:09:56 +0200 Subject: [PATCH] draft: lsof --- .../draft_overlay.json | 2 +- .../draft_overlay.md | 64 ++++++++++-------- .../files/dummy.png | Bin 16955 -> 0 bytes 3 files changed, 38 insertions(+), 28 deletions(-) delete mode 100644 1901a8ba-1b1c-42f7-9251-c7aee6cab604/files/dummy.png diff --git a/1901a8ba-1b1c-42f7-9251-c7aee6cab604/draft_overlay.json b/1901a8ba-1b1c-42f7-9251-c7aee6cab604/draft_overlay.json index 4e14e90..e2ff441 100644 --- a/1901a8ba-1b1c-42f7-9251-c7aee6cab604/draft_overlay.json +++ b/1901a8ba-1b1c-42f7-9251-c7aee6cab604/draft_overlay.json @@ -1,4 +1,4 @@ { "title": "lsof", - "_updated_at": "2026-05-16 21:08:51" + "_updated_at": "2026-05-16 21:09:56" } diff --git a/1901a8ba-1b1c-42f7-9251-c7aee6cab604/draft_overlay.md b/1901a8ba-1b1c-42f7-9251-c7aee6cab604/draft_overlay.md index 793dafc..2664210 100644 --- a/1901a8ba-1b1c-42f7-9251-c7aee6cab604/draft_overlay.md +++ b/1901a8ba-1b1c-42f7-9251-c7aee6cab604/draft_overlay.md @@ -1,42 +1,52 @@ # lsof +`lsof` signifie **List Open Files**. C'est un outil en ligne de commande qui affiche les fichiers ouverts par les processus en cours d'exécution sur un système Linux. Sous Linux, presque tout est un fichier : fichiers réguliers, sockets, pipes nommées, périphériques bloc et caractère. `lsof` permet donc d'inspecter aussi bien les fichiers classiques manipulés par une application que les connexions réseau ou les descripteurs ouverts par un démon. -`lsof` signifie **List Open Files**. C'est un outil en ligne de commande qui vous permet de voir les fichiers ouverts par les processus en cours d'exécution sur votre système Linux. Chaque processus utilise des fichiers pour communiquer avec le système, les autres processus et les périphériques, et lsof vous montre les fichiers qui sont utilisés par chaque processus. - -Avec **lsof**, vous pouvez voir les fichiers de tout type, tels que les fichiers réguliers, les fichiers de sockets, les pipes nommées, les fichiers de blocs et les fichiers de caractères, qui sont utilisés par les processus en cours d'exécution sur votre système. Vous pouvez également utiliser **lsof** pour trouver les processus qui écoutent sur des ports réseau spécifiques, ce qui est utile pour déterminer les services en cours d'exécution sur votre système et qui utilisent un port donné. +C'est notamment l'outil de référence pour identifier le processus qui écoute sur un port donné ou qui retient un fichier verrouillé. ## Installer lsof -**lsof** n'est pas installé par défaut sur toutes les distributions. Cependant, il est facilement disponible dans les dépôts officiels et peut être installé facilement. -Si vous essayez d'utiliser **lsof** et que le système ne le reconnaît pas, cela signifie probablement qu'il n'est pas installé. +`lsof` n'est pas toujours présent par défaut, mais il figure dans les dépôts officiels de la plupart des distributions. Si la commande renvoie `command not found`, installez-la : - sudo apt update - sudo apt install lsof +```bash +sudo apt update +sudo apt install lsof +``` -Une fois l'installation terminée, vous pouvez utiliser la commande `lsof` pour afficher les fichiers ouverts par les processus en cours d'exécution. +## Lister les connexions réseau actives -## Consulter les connexions TCP et UDP -L'option -i de la commande lsof permet de consulter les connexions TCP et UDP en cours d'utilisation sur votre système Linux. +L'option `-i` affiche les fichiers ouverts par les processus utilisant le réseau. Sans argument, elle liste toutes les connexions TCP et UDP en cours : -Par exemple, la commande suivante affichera les processus qui écoutent sur le port 993 : +```bash +lsof -i +``` - lsof -i :993 - -La sortie de cette commande vous montrera le nom du processus, le numéro de PID, le nom d'utilisateur et d'autres informations sur les processus qui écoutent sur le port 993. - -L'option -i peut être combinée avec d'autres options de la commande lsof pour affiner les résultats, selon vos besoins. Par exemple, vous pouvez utiliser -i TCP pour afficher uniquement les processus qui utilisent des sockets TCP, ou -i UDP pour afficher uniquement les processus qui utilisent des sockets UDP. - --- - -La commande `lsof -i` permet d'afficher les fichiers ouverts par les processus qui utilisent des connexions réseau actives sur le système. Si vous utilisez la commande `lsof -i` sans spécifier de numéro de port, elle affichera toutes les connexions réseau actives sur le système, y compris les connexions TCP et UDP. - -Cela peut être utile pour déterminer quels processus utilisent des connexions réseau, les adresses IP et les noms d'hôtes auxquels ils sont connectés, les ports locaux et distants utilisés pour la connexion, et d'autres informations sur les connexions réseau actives sur le système. - -Notez que l'utilisation de `lsof` avec la commande `sudo` peut être nécessaire pour afficher toutes les connexions réseau, car certaines connexions peuvent être ouvertes par des processus qui n'appartiennent pas à votre utilisateur courant. +Vous obtenez le nom du processus, son PID, l'utilisateur propriétaire, le protocole, ainsi que les adresses et ports locaux et distants. Notez qu'un `sudo` est souvent nécessaire pour voir les connexions ouvertes par d'autres utilisateurs. ![](20230217-185748.png) -## Différence entre netstat et lsof -**netstat -tulpn** et **lsof -i** sont tous les deux des outils qui permettent d'obtenir des informations sur les connexions réseau en cours sur un système Linux. +### Filtrer par port ou par protocole -Si vous souhaitez obtenir une vue complète des statistiques réseau sur votre système Linux, **netstat -tulpn** peut être la meilleure option. Si vous souhaitez obtenir des informations sur les fichiers ouverts par les processus en cours d'exécution, **lsof -i** peut être plus utile. Les deux outils peuvent être utiles selon les besoins, et vous pouvez utiliser celui qui vous convient le mieux en fonction de la tâche que vous souhaitez accomplir. \ No newline at end of file +Pour cibler un port précis : + +```bash +lsof -i :993 +``` + +Pour ne garder qu'un protocole : + +```bash +lsof -i TCP +lsof -i UDP +``` + +Ces filtres se combinent (`lsof -i TCP:443`) et permettent rapidement d'identifier quel service occupe un port donné. + +## Différence entre `netstat` et `lsof` + +`netstat -tulpn` et `lsof -i` répondent à des besoins voisins, mais avec des angles différents : + +- **`netstat -tulpn`** offre une vue synthétique des sockets en écoute et établies. C'est l'outil à privilégier pour un aperçu rapide de l'état réseau du système. +- **`lsof -i`** raisonne en termes de *fichiers ouverts* : il montre les connexions réseau, mais aussi le contexte du processus (utilisateur, descripteurs, fichiers associés). C'est le bon choix pour enquêter sur un processus précis ou diagnostiquer un port bloqué. + +En pratique, les deux sont complémentaires : `netstat` (ou `ss`, son successeur moderne) pour l'inventaire, `lsof` pour l'investigation détaillée. \ No newline at end of file diff --git a/1901a8ba-1b1c-42f7-9251-c7aee6cab604/files/dummy.png b/1901a8ba-1b1c-42f7-9251-c7aee6cab604/files/dummy.png deleted file mode 100644 index 58bb8812cfe1f037f8ee800fccba15034d8a4364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16955 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