[{"content":" Ce mémo rassemble les commandes Git que j\u0026rsquo;utilise (ou que tout le monde finit par chercher un jour) : du git init de base jusqu\u0026rsquo;au workflow de branches que j\u0026rsquo;utilise sur mes projets homelab. Pensé pour être copié-collé directement dans un terminal, que vous débutez ou que vous ayez juste besoin de chercher une simple commande.\nSommaire Configuration initiale Créer / cloner un dépôt Le cycle de base Branches Stratégie de branches : unstable/development \u0026amp; stable Fusion et rebase Remote (dépôts distants) Historique et inspection Annuler des changements Stash Tags Cherry-pick Submodules .gitignore \u0026amp; fichiers ignorés git bisect : trouver un commit fautif git worktree : plusieurs branches en parallèle Sparse checkout : ne cloner qu\u0026rsquo;une partie du dépôt Signer ses commits (GPG / SSH) Git hooks .gitattributes Git LFS (gros fichiers) rerere : réutiliser la résolution de conflits Alias utiles Bonnes pratiques de messages de commit Dépannage courant Aide-mémoire express Bonus : créer des templates d\u0026rsquo;issues dans GitHub Configuration initiale Commande Explication git config --global user.name \u0026quot;Noé\u0026quot; Définit votre nom pour tous les dépôts git config --global user.email \u0026quot;noe@example.com\u0026quot; Définit votre email pour tous les dépôts git config --global core.editor \u0026quot;vim\u0026quot; Définit l\u0026rsquo;éditeur utilisé par Git (messages de commit, rebase interactif…) git config --global init.defaultBranch main Renomme la branche par défaut créée par git init git config --list Affiche toute la configuration active git config --list --show-origin Affiche la config avec le fichier d\u0026rsquo;origine de chaque valeur git config user.email \u0026quot;...\u0026quot; Change la config uniquement pour le dépôt courant (sans --global) git config --global alias.st status Crée un alias de commande (ici git st) Créer / cloner un dépôt Commande Explication git init mon-projet Crée un nouveau dépôt local dans un dossier git clone \u0026lt;url\u0026gt; Clone un dépôt distant en local git clone \u0026lt;url\u0026gt; mon-dossier Clone dans un dossier au nom choisi git clone -b develop --single-branch \u0026lt;url\u0026gt; Clone uniquement la branche develop git clone --depth 1 \u0026lt;url\u0026gt; Clone superficiel : ne récupère que le dernier commit (plus rapide) Le cycle de base Commande Explication git status Affiche l\u0026rsquo;état du dépôt (fichiers modifiés, indexés, etc.) git status -s Version courte du statut git add fichier.py Ajoute un fichier précis à l\u0026rsquo;index (staging) git add . Ajoute tous les fichiers du dossier courant git add -A Ajoute tout le dépôt, y compris les suppressions git add -p Ajout interactif, hunk par hunk git commit -m \u0026quot;message\u0026quot; Crée un commit avec un message git commit -am \u0026quot;message\u0026quot; Ajoute (fichiers déjà suivis) et committe en une commande git commit --amend Modifie le dernier commit (message et/ou contenu) git diff Différences non indexées vs dernier commit git diff --staged Différences indexées vs dernier commit git diff HEAD~1 HEAD Différences entre deux commits Branches Commande Explication git branch Liste les branches locales git branch -a Liste aussi les branches distantes git branch feature/dark-mode Crée une nouvelle branche git checkout -b feature/dark-mode Crée une branche et bascule dessus git switch -c feature/dark-mode Équivalent moderne de la commande ci-dessus git checkout main Bascule sur la branche main git switch main Équivalent moderne pour basculer de branche git branch -m nouveau-nom Renomme la branche courante git branch -d feature/dark-mode Supprime une branche locale déjà fusionnée git branch -D feature/dark-mode Force la suppression, même non fusionnée git push origin --delete feature/dark-mode Supprime la branche sur le dépôt distant git branch --contains \u0026lt;hash\u0026gt; Liste les branches contenant un commit donné Stratégie de branches : unstable/development \u0026amp; stable Un modèle simple et robuste, adapté à un projet solo ou petite équipe : une branche stable qui reflète toujours un état fonctionnel/déployable, et une branche unstable/development où le travail actif se fait.\nMise en place initiale\nCommande Explication git branch -m main stable Renomme la branche main existante en stable git push -u origin stable Pousse et lie la branche stable au dépôt distant git checkout stable Se place sur stable avant de créer la branche de dev git checkout -b unstable/development Crée la branche de développement à partir de stable git push -u origin unstable/development Pousse et lie la branche unstable/development Workflow quotidien\nOn travaille toujours sur unstable/development (ou une sous-branche) git checkout unstable/development git pull origin unstable/development Option A : commit direct sur unstable/development git add . git commit -m \u0026#34;Ajout d\u0026#39;une fonction de téléchargement en arrière-plan\u0026#34; git push origin unstable/development Il est toujours bon de faire des messages de commit en anglais. Dans cet exemple il est en français, c\u0026rsquo;est faisable aussi mais il faut toujours le faire en anglais.\nOption B (recommandée) : une branche de feature par sujet, # Fusionnée dans unstable/development git checkout unstable/development git checkout -b feature/background-download # Commit de ma fonctionnalité git add . git commit -m \u0026#34;Ajout d\u0026#39;une fonction de téléchargement en arrière-plan\u0026#34; git checkout unstable/development git merge --no-ff feature/background-download git push origin unstable/development git branch -d feature/background-download Promotion vers stable # Une fois que unstable/development est testée et jugée fiable : git checkout stable git pull origin stable git merge --no-ff unstable/development -m \u0026#34;Merge unstable/development into stable\u0026#34; git push origin stable # Marquer la version stable avec un tag (bonne pratique) git tag -a v1.4.0 -m \u0026#34;Version stable 1.4.0\u0026#34; git push origin v1.4.0 Correctif urgent sur stable (hotfix) git checkout stable git checkout -b hotfix/fix-buffer-overflow # ... correctif ... git commit -am \u0026#34;Fix d\u0026#39;un dépassement de mémoire tempon\u0026#34; # On merge le hotfix dans stable ET dans unstable/development git checkout stable git merge --no-ff hotfix/fix-buffer-overflow git push origin stable git checkout unstable/development git merge --no-ff hotfix/fix-buffer-overflow git push origin unstable/development git branch -d hotfix/fix-buffer-overflow Variante GitFlow-like : ajouter des branches feature/*, release/* et hotfix/* autour des deux branches principales si le projet grossit. Pour un projet en solo, le schéma stable + unstable/development + branches de feature courtes suffit largement.\nFusion et rebase Commande Explication git merge unstable/development Fusion classique, garde l\u0026rsquo;historique des deux branches git merge --no-ff unstable/development Fusion sans fast-forward, force un commit de merge (traçabilité) git rebase unstable/development Rejoue les commits de la branche courante sur une autre base git rebase -i HEAD~5 Rebase interactif : réécrire, squasher, réordonner des commits git rebase --abort Annule un rebase en cours si les conflits sont ingérables git rebase --continue Continue le rebase après résolution d\u0026rsquo;un conflit Merge vs rebase, en bref :\nmerge : préserve l\u0026rsquo;historique réel, crée un commit de fusion. Sûr sur des branches partagées comme stable. rebase : historique linéaire et propre, mais réécrit les commits (hash différents). À éviter sur des branches déjà partagées/publiées. Remote (dépôts distants) Commande Explication git remote -v Affiche les remotes configurés git remote add origin \u0026lt;url\u0026gt; Ajoute un remote nommé origin git remote set-url origin \u0026lt;url\u0026gt; Change l\u0026rsquo;URL d\u0026rsquo;un remote existant git fetch origin Récupère les changements sans les fusionner git pull origin unstable/development Récupère et fusionne (fetch + merge) git pull --rebase origin unstable/development Pull avec rebase au lieu de merge git push -u origin unstable/development Pousse une branche et lie le suivi (upstream) git push --force Pousse en forçant (danger : réécrit l\u0026rsquo;historique distant) git push --force-with-lease Force-push plus sûr, échoue si quelqu\u0026rsquo;un d\u0026rsquo;autre a poussé entre-temps Historique et inspection Commande Explication git log Historique complet des commits git log --oneline Historique compact, une ligne par commit git log --oneline --graph --all --decorate Historique graphique avec toutes les branches git blame fichier.py Voir qui a modifié quoi, ligne par ligne git show \u0026lt;hash\u0026gt; Affiche le détail d\u0026rsquo;un commit précis git log -S \u0026quot;texte\u0026quot; Recherche un texte dans les diffs des commits git log --grep=\u0026quot;firewall\u0026quot; Recherche dans les messages de commit git show --stat HEAD Fichiers modifiés dans le dernier commit Annuler des changements Commande Explication git restore --staged fichier.py Retire un fichier de la zone de staging (sans perdre les modifs) git restore fichier.py Annule les modifications locales d\u0026rsquo;un fichier (perte définitive) git reset --soft HEAD~1 Revient un commit en arrière, modifs gardées en staging git reset --mixed HEAD~1 Revient un commit en arrière, modifs remises en non-indexé (par défaut) git reset --hard HEAD~1 Revient un commit en arrière, tout est perdu (attention) git revert \u0026lt;hash\u0026gt; Crée un nouveau commit qui annule un commit existant (sûr sur branche partagée) Stash Il arrive régulièrement qu’on ait besoin de mettre du travail de côté le temps de traiter une tâche prioritaire sur notre projet ou de récupérer les nouveautés produites par nos collègues qui sont nécessaires à notre travail courant. Plutôt que de créer un commit dont les contenus seront mal finis, nous préférerons isoler ce travail dans la remise Git, appelée stash en anglais.\nSource : https://comprendre-git.com/fr/commandes/git-stash/\nCommande Explication git stash Met de côté les modifications en cours git stash push -m \u0026quot;message\u0026quot; Stash avec un message descriptif git stash list Liste les stash existants git stash pop Réapplique le dernier stash et le retire de la liste git stash apply Réapplique sans le retirer de la liste git stash apply stash@{2} Réapplique un stash précis git stash drop stash@{2} Supprime un stash précis git stash clear Vide tous les stash Tags Commande Explication git tag v1.0.0 Crée un tag léger git tag -a v1.0.0 -m \u0026quot;message\u0026quot; Crée un tag annoté (recommandé, contient auteur/date/message) git tag Liste tous les tags git push origin v1.0.0 Pousse un tag précis git push origin --tags Pousse tous les tags git tag -d v1.0.0 Supprime un tag localement git push origin --delete v1.0.0 Supprime un tag sur le dépôt distant Cherry-pick Le Git Cherry Pick permet de copier un commit d\u0026rsquo;une branche à une autre.\nSource : https://dev.to/aurelievache/git-par-lexemple-cherie-ca-va-cherry-picker--37c8\nCommande Explication git cherry-pick \u0026lt;hash\u0026gt; Applique un commit précis d\u0026rsquo;une autre branche sur la branche courante git cherry-pick \u0026lt;hash1\u0026gt; \u0026lt;hash2\u0026gt; Cherry-pick plusieurs commits git cherry-pick --no-commit \u0026lt;hash\u0026gt; Applique sans committer directement (pour ajuster avant) Utile typiquement pour porter un correctif de hotfix/* vers unstable/development sans tout fusionner.\nSubmodules Les submodule permet d\u0026rsquo;ajouter directement un module à son dépôt sans à devoir cloner manuellement le module entier. Par exemple, pour ajouter un thème dans Hugo ça fonctionne par un système de submodules.\nCommande Explication git submodule add \u0026lt;url\u0026gt; chemin/ Ajoute un submodule dans le dépôt git clone --recurse-submodules \u0026lt;url\u0026gt; Clone un dépôt avec ses submodules git submodule update --init --recursive Initialise les submodules après un clone classique git submodule update --remote --merge Met à jour tous les submodules .gitignore \u0026amp; fichiers ignorés Commande Explication git status --ignored Affiche quels fichiers sont ignorés git rm --cached fichier-secret.env Arrête de suivre un fichier sans le supprimer du disque git check-ignore -v chemin/fichier Vérifie pourquoi un fichier est ignoré Exemple de .gitignore :\n__pycache__/ *.pyc .env node_modules/ .DS_Store *.log git bisect : trouver un commit fautif Très utile pour retrouver quel commit a introduit un bug, par recherche dichotomique automatique.\nCommande Explication git bisect start Démarre une session de recherche git bisect bad Marque le commit actuel comme mauvais (bug présent) git bisect good v1.2.0 Marque un ancien commit connu comme bon (bug absent) git bisect good / git bisect bad Indique le résultat du test sur le commit proposé par Git git bisect reset Termine la session une fois le commit fautif trouvé git bisect run ./test-script.sh Automatise la recherche avec un script qui retourne 0 (bon) ou 1 (mauvais) git worktree : plusieurs branches en parallèle Permet d\u0026rsquo;avoir plusieurs branches \u0026ldquo;checkout\u0026rdquo; en même temps, chacune dans son propre dossier, sans avoir à cloner le dépôt plusieurs fois ni à stash sans arrêt.\nCommande Explication git worktree add ../projet-dev unstable/development Ajoute un worktree pour une branche donnée dans un autre dossier git worktree list Liste les worktrees actifs git worktree remove ../projet-dev Supprime un worktree git worktree prune Nettoie les références obsolètes Exemple concret : garder ~/block-asn-noise sur stable en prod, et travailler dans ~/block-asn-noise-dev sur unstable/development sans changer de branche à répétition.\nSparse checkout : ne cloner qu\u0026rsquo;une partie du dépôt Commande Explication git clone --no-checkout --filter=blob:none \u0026lt;url\u0026gt; Clone sans checkout initial, sans télécharger tous les blobs git sparse-checkout init --cone Active le mode sparse checkout git sparse-checkout set scripts/ docs/ Choisit les dossiers à réellement récupérer git checkout unstable/development Effectue le checkout une fois la config posée Pratique sur un monorepo volumineux quand on n\u0026rsquo;a besoin que d\u0026rsquo;un sous-dossier (par exemple juste scripts/ d\u0026rsquo;un dépôt).\nSigner ses commits (GPG / SSH) Commande Explication gpg --full-generate-key Génère une nouvelle clé GPG gpg --list-secret-keys --keyid-format=long Liste les clés GPG disponibles git config --global user.signingkey \u0026lt;ID_CLE\u0026gt; Associe une clé de signature à ta config Git git config --global commit.gpgsign true Signe automatiquement tous les commits git commit -S -m \u0026quot;message\u0026quot; Signe un commit ponctuellement git log --show-signature -1 Vérifie la signature du dernier commit git config --global gpg.format ssh Passe en mode signature via clé SSH (alternative moderne à GPG) Signer ses dépôts garantissent que les commits poussés sur GitHub proviennent bien de vous.\nGit hooks Scripts exécutés automatiquement à certains moments du cycle de vie Git, stockés dans .git/hooks/. L’objectif des hooks est simple : il s’agit de fournir des enrobages à certaines commandes pour permettre l’injection de scripts (Bash, Node.js, Perl, Python, PHP…). De cette manière nous pouvons automatiser et donc fiabiliser une partie du travail côté client (machine de l’utilisateur) mais aussi côté serveur.\nSource : https://comprendre-git.com/fr/automatisation/git-hooks/\nHook Quand il se déclenche pre-commit Juste avant la création d\u0026rsquo;un commit (ex : lancer des tests) commit-msg Pour valider/formater le message de commit pre-push Avant un git push post-checkout Après un changement de branche Exemple : hook pre-commit qui bloque le commit si un test échoue\ncat \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; \u0026gt; .git/hooks/pre-commit #!/bin/sh ./run-tests.sh EOF chmod +x .git/hooks/pre-commit Les hooks ne sont pas versionnés par défaut (ils vivent dans .git/, non suivi). Pour les partager avec une équipe, utiliser un outil comme Husky (Node) ou configurer core.hooksPath vers un dossier versionné : git config core.hooksPath .githooks\n.gitattributes Exemple de fichier .gitattributes :\n# Normaliser les fins de ligne * text=auto eol=lf # Traiter certains fichiers comme binaires (pas de diff texte) *.png binary *.jpg binary # Fichiers à exclure des exports (git archive) docs/internal.md export-ignore # Forcer un diff spécifique pour certains types *.ipynb diff=jupyternotebook Git LFS (gros fichiers) Pour versionner de gros binaires (images, audio, ISOs) sans alourdir l\u0026rsquo;historique Git.\nCommande Explication git lfs install Installe Git LFS dans le dépôt git lfs track \u0026quot;*.iso\u0026quot; Suit un type de fichier via LFS git add .gitattributes Committe la config LFS générée git lfs ls-files Liste les fichiers suivis par LFS git lfs pull Récupère les fichiers LFS après un clone rerere : réutiliser la résolution de conflits rerere (reuse recorded resolution) mémorise comment un conflit a été résolu, pour l\u0026rsquo;appliquer automatiquement s\u0026rsquo;il revient (typique lors de rebases répétés).\nCommande Explication git config rerere.enabled true Active rerere pour le dépôt git rerere status Affiche l\u0026rsquo;état des résolutions enregistrées git rerere diff Montre le diff de la résolution enregistrée Alias utiles Commande de config Résultat git config --global alias.st status git st → git status git config --global alias.co checkout git co → git checkout git config --global alias.br branch git br → git branch git config --global alias.cm \u0026quot;commit -m\u0026quot; git cm \u0026quot;msg\u0026quot; → git commit -m \u0026quot;msg\u0026quot; git config --global alias.lg \u0026quot;log --oneline --graph --all --decorate\u0026quot; git lg → historique graphique compact git config --global alias.last \u0026quot;log -1 HEAD\u0026quot; git last → détail du dernier commit git config --global alias.unstage \u0026quot;restore --staged\u0026quot; git unstage fichier → retire du staging Bonnes pratiques de messages de commit \u0026lt;type\u0026gt;(\u0026lt;scope\u0026gt;): \u0026lt;résumé court à l\u0026#39;impératif\u0026gt; \u0026lt;corps optionnel expliquant le pourquoi, pas juste le quoi\u0026gt; \u0026lt;footer optionnel : issues liées, breaking changes\u0026gt; Exemple Type fix(firewall): ajoute la règle ESTABLISHED,RELATED avant les DROP ipset fix feat(dashboard): ajoute l'affichage de l'uptime dans 00-custom-dashboard feat docs(readme): met à jour les instructions d'installation curl | bash docs chore(deps): met à jour mutagen vers la dernière version chore Types courants : feat, fix, docs, style, refactor, perf, test, chore.\nDépannage courant Problème / Commande Explication git pull origin main --allow-unrelated-histories Corrige \u0026ldquo;fatal: refusing to merge unrelated histories\u0026rdquo; git status Voir les fichiers en conflit après un merge/rebase raté git diff --name-only --diff-filter=U Liste uniquement les fichiers en conflit git checkout \u0026lt;hash-avant-suppression\u0026gt; -- chemin/fichier Récupère un fichier supprimé par erreur (encore dans l\u0026rsquo;historique) git reflog Retrouve un commit \u0026ldquo;perdu\u0026rdquo; après un reset --hard git clean -n Dry-run : montre ce qui serait supprimé par un nettoyage git clean -fd Supprime les fichiers + dossiers non suivis (irréversible) git gc Nettoie et optimise le dépôt git count-objects -vH Vérifie la taille du dépôt Pour résoudre un conflit manuellement : ouvrir les fichiers marqués \u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt; ======= \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;, éditer pour garder la bonne version, puis :\ngit add fichier-en-conflit.py git commit Schéma récapitulatif du workflow stable / unstable feature/xyz ──┐ ├─▶ unstable/development ──▶ (tests OK) ──▶ merge --no-ff ──▶ stable ──▶ tag vX.Y.Z hotfix/xyz ───┘ ▲ │ └──────────────── merge hotfix également ─────────────┘ Aide-mémoire express Les 20 commandes qui couvrent 90% des besoins au quotidien :\nCommande Explication git status Où j\u0026rsquo;en suis git add . Tout indexer git commit -m \u0026quot;message\u0026quot; Committer git push Envoyer git pull Récupérer + fusionner git log --oneline --graph --all Voir l\u0026rsquo;historique git checkout -b nom-branche Nouvelle branche git switch autre-branche Changer de branche git merge autre-branche Fusionner git branch -d nom-branche Supprimer une branche git diff Voir les changements git stash / git stash pop Mettre de côté / récupérer git reset --soft HEAD~1 Annuler le dernier commit (garder les modifs) git revert \u0026lt;hash\u0026gt; Annuler proprement un commit publié git tag -a vX.Y.Z -m \u0026quot;message\u0026quot; Tagger une version git remote -v Voir les remotes git fetch Récupérer sans fusionner git cherry-pick \u0026lt;hash\u0026gt; Reprendre un commit précis git clone \u0026lt;url\u0026gt; Cloner un dépôt git reflog Retrouver un commit \u0026ldquo;perdu\u0026rdquo; Bonus : créer des templates d\u0026rsquo;issues dans GitHub Structure de base Le dossier ISSUE_TEMPLATE doit se trouver à l\u0026rsquo;intérieur du dossier .github. Donc tous les fichiers iront dans .github/ISSUE_TEMPLATE\nGitHub propose deux systèmes :\nMarkdown classique (.md) : un simple texte pré-rempli que l\u0026rsquo;utilisateur édite librement. Facile à écrire, mais rien n\u0026rsquo;oblige personne à respecter la structure. YAML forms (.yml) : un vrai formulaire avec champs typés, validations, menus déroulants. C\u0026rsquo;est le format recommandé depuis que GitHub l\u0026rsquo;a stabilisé. Sauf contrainte particulière, préférez toujours le YAML. La contrainte imposée au moment de la saisie vaut largement l\u0026rsquo;effort de configuration initial.\nStructure d\u0026rsquo;un template YML name: Bug Report description: Signaler un dysfonctionnement title: \u0026#34;[Bug]: \u0026#34; labels: [\u0026#34;bug\u0026#34;, \u0026#34;triage\u0026#34;] assignees: [] body: - type: markdown attributes: value: | Merci de prendre le temps de remplir ce formulaire. Avant tout, vérifiez qu\u0026#39;une issue similaire n\u0026#39;existe pas déjà. - type: input id: version attributes: label: Version concernée placeholder: \u0026#34;ex : v2.1.0\u0026#34; validations: required: true - type: dropdown id: environnement attributes: label: Environnement options: - Debian - Ubuntu - Fedora - Autre (préciser ci-dessous) validations: required: true - type: textarea id: repro attributes: label: Étapes de reproduction description: Le plus précisément possible, étape par étape placeholder: | 1. Lancer le script avec... 2. Observer... validations: required: true - type: textarea id: attendu attributes: label: Comportement attendu vs observé validations: required: true - type: textarea id: logs attributes: label: Logs pertinents render: shell validations: required: false - type: checkboxes id: checklist attributes: label: Vérifications préalables options: - label: J\u0026#39;ai cherché si une issue similaire existe déjà required: true Quelques points utiles :\ntitle pré-remplit le préfixe, ça uniformise le tri visuel dans la liste des issues. labels appliqués automatiquement évitent d\u0026rsquo;y penser à chaque fois. validations: required doit être réservé aux champs vraiment indispensables. Trop de champs obligatoires = abandon du formulaire. render: shell (ou bash, text\u0026hellip;) sur un textarea affiche le contenu dans un bloc de code, très utile pour des logs ou des sorties de commande. Les templates à avoir au minimum Bug report Version, environnement, étapes de reproduction, comportement attendu/observé, logs. C\u0026rsquo;est le template qui a le plus besoin d\u0026rsquo;être cadré, car c\u0026rsquo;est celui qu\u0026rsquo;on remplit à moitié frustré.\nFeature request Quel problème ça résout, solution envisagée, alternatives déjà considérées. Ici on veut plutôt de la réflexion que des cases à cocher — du texte libre bien guidé fonctionne mieux qu\u0026rsquo;un formulaire trop rigide.\nQuestion / Support (optionnel) Sur beaucoup de projets, mieux vaut rediriger vers les Discussions GitHub plutôt que de polluer le tracker d\u0026rsquo;issues avec des questions. Le config.yml (point suivant) permet de faire ce renvoi proprement.\nLe fichier de configuration Un fichier .github/ISSUE_TEMPLATE/config.yml complète le dispositif :\nblank_issues_enabled: false contact_links: - name: Question générale url: https://github.com/votre-repo/discussions about: Pour toute question qui n\u0026#39;est pas un bug ou une feature request - name: Documentation url: https://votre-doc.example.com about: Consultez d\u0026#39;abord la documentation blank_issues_enabled: false est le réglage le plus sous-estimé : il désactive l\u0026rsquo;option \u0026ldquo;ouvrir une issue vierge\u0026rdquo; et force à passer par un template. Sans ça, une bonne partie des gens prendra le chemin le plus court et vos templates soigneusement conçus resteront ignorés.\nBonnes pratiques de rédaction Des placeholders concrets, pas des instructions abstraites. \u0026quot;ex : v2.1.0\u0026quot; est plus utile que \u0026quot;indiquez la version\u0026quot;. Limitez-vous à 4-6 champs pour un bug report. Au-delà, le taux d\u0026rsquo;abandon grimpe. Si vous avez besoin de plus d\u0026rsquo;infos, envisagez un champ \u0026ldquo;environnement\u0026rdquo; unique qui regroupe OS + versions plutôt que trois champs séparés. Une checkbox de pré-vérification (\u0026ldquo;j\u0026rsquo;ai cherché une issue existante\u0026rdquo;) réduit sensiblement les doublons, pour un coût de mise en place nul. Pensez à l\u0026rsquo;environnement technique propre à votre projet. Sur un outil qui touche à iptables, Docker ou des services réseau, un champ dédié à la version du noyau, de Docker ou de la distribution évite des allers-retours quasi systématiques. Testez le formulaire vous-même en ouvrant une fausse issue avant de le considérer terminé. On repère tout de suite les champs mal libellés ou les options de dropdown manquantes. Le piège principal Le sur-cadrage. Un formulaire trop long ou trop strict pousse les contributeurs occasionnels à laisser tomber, ou à remplir n\u0026rsquo;importe quoi juste pour passer l\u0026rsquo;étape. Le bon réglage, c\u0026rsquo;est le minimum de champs obligatoires qui permet de trier et reproduire un bug sans repasser par l\u0026rsquo;auteur. Tout le reste peut être optionnel ou demandé après coup en commentaire.\nEntretien dans le temps Un template n\u0026rsquo;est jamais figé. Si vous constatez que la moitié des issues laissent le champ \u0026ldquo;logs\u0026rdquo; vide, ou que tout le monde répond pareil à une question, c\u0026rsquo;est un signal pour ajuster le formulaire. Revoir ses templates tous les quelques mois, à la lumière des issues réellement reçues, est plus efficace que de vouloir tout anticiper dès le départ.\n","permalink":"https://blog.noe-georget.fr/posts/systemes/le-memo-git/","summary":"Un mémo Git complet, des bases au workflow de branches stable/unstable, avec des exemples concrets et copiables.","title":"Le mémo Git"},{"content":"Iptables est l\u0026rsquo;outil de pare-feu Linux classique pour le filtrage, le NAT et la manipulation de paquets. Ce memo couvre les commandes les plus courantes pour inspecter les règles, autoriser ou bloquer le trafic, effectuer la redirection de ports et gérer la persistance.\n1. Consultation des règles Commande Description sudo iptables -L Lister les règles sudo iptables -L -n Lister sans résolution DNS sudo iptables -L -v Sortie détaillée (compteurs, interfaces) sudo iptables -L -n --line-numbers Afficher les numéros de règle sudo iptables -S Afficher les règles sous forme de commandes sudo iptables -t nat -L -n -v Voir les règles NAT 2. Politiques par défaut Commande Description sudo iptables -P INPUT DROP Drop par défaut en entrée sudo iptables -P FORWARD DROP Drop par défaut en forwarding sudo iptables -P OUTPUT ACCEPT Accept par défaut en sortie 3. Autoriser du trafic Commande Description sudo iptables -A INPUT -i lo -j ACCEPT Autoriser le loopback sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT Autoriser les connexions établies sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT Autoriser SSH sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT Autoriser HTTP sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT Autoriser HTTPS sudo iptables -A INPUT -p icmp -j ACCEPT Autoriser le ping sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT Autoriser un sous-réseau ⚠️ La règle ESTABLISHED,RELATED doit toujours être placée avant toute règle de DROP basée sur ipset/GeoIP/ASN, sinon le trafic retour légitime peut être coupé (cf. section Docker ci-dessous).\n4. Bloquer du trafic Commande Description sudo iptables -A INPUT -s 203.0.113.10 -j DROP Bloquer une IP sudo iptables -A INPUT -s 203.0.113.0/24 -j DROP Bloquer un sous-réseau sudo iptables -A INPUT -p tcp --dport 23 -j DROP Bloquer Telnet sudo iptables -A INPUT -p tcp --dport 25 -j REJECT Rejeter SMTP sudo iptables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP Bloquer une adresse MAC 5. Redirection de ports (DNAT) Commande Description sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80 Rediriger un port vers un hôte sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80 Rediriger un port local sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT Autoriser le trafic forwardé 6. NAT (Masquerade) Commande Description sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE NAT dynamique sur une interface sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1 NAT statique sudo sysctl -w net.ipv4.ip_forward=1 Activer l\u0026rsquo;IP forwarding 7. Limitation de débit Commande Description sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min --limit-burst 3 -j ACCEPT Limiter les tentatives SSH sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP Limiter les connexions par IP sudo iptables -A INPUT -p icmp -m limit --limit 1/sec -j ACCEPT Limiter le ping 8. Logging Commande Description sudo iptables -A INPUT -j LOG --log-prefix \u0026quot;IPT-DROP: \u0026quot; Logger les paquets droppés sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix \u0026quot;SSH: \u0026quot; --log-level 4 Logger l\u0026rsquo;accès SSH sudo iptables -A INPUT -m limit --limit 5/min -j LOG Logger avec limitation de débit 9. Suppression et insertion de règles Commande Description sudo iptables -D INPUT 3 Supprimer la règle n°3 sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT Supprimer par spécification sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT Insérer une règle en tête sudo iptables -R INPUT 3 -p tcp --dport 443 -j ACCEPT Remplacer la règle n°3 sudo iptables -F Vider toutes les règles sudo iptables -F INPUT Vider uniquement la chaîne INPUT 10. Sauvegarde et restauration Commande Description sudo iptables-save \u0026gt; /etc/iptables/rules.v4 Sauvegarder les règles sudo iptables-restore \u0026lt; /etc/iptables/rules.v4 Restaurer les règles sudo apt install iptables-persistent Persistance auto sur Debian/Ubuntu sudo service iptables save Sauvegarde sur RHEL et dérivés 11. Cas particulier : Docker / Podman / Kubernetes Ces environnements manipulent directement iptables au niveau du kernel, souvent en dehors des règles gérées manuellement — ce qui casse fréquemment les setups perso si on ne le sait pas.\nDocker Docker crée ses propres chaînes : DOCKER, DOCKER-USER, DOCKER-ISOLATION-STAGE-1/2, insérées dans FORWARD. DOCKER-USER est la seule chaîne prévue pour que l\u0026rsquo;admin ajoute ses propres règles (filtrage IP/ASN, GeoIP, etc.) sans que Docker ne les écrase au redémarrage du daemon. Piège classique : si une règle ipset/GeoIP en DROP est placée dans DOCKER-USER avant un bypass ESTABLISHED,RELATED, le trafic retour des connexions déjà ouvertes vers les conteneurs est cassé. # Ordre correct dans DOCKER-USER sudo iptables -I DOCKER-USER 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -I DOCKER-USER 2 -m set --match-set blocklist src -j DROP Docker réinjecte ses chaînes à chaque restart du daemon → toute règle ajoutée manuellement dans DOCKER-USER doit être réappliquée via un script (setup-firewall.sh, service systemd, ou hook --iptables=false + gestion manuelle complète). docker network publie les ports via DNAT dans la chaîne DOCKER (table nat), pas via INPUT — donc filtrer uniquement INPUT ne bloque pas le trafic vers les conteneurs exposés. Podman En mode rootless, Podman utilise généralement netavark ou CNI et peut passer par nftables selon la distro, avec un comportement différent de Docker (pas de chaîne DOCKER-USER équivalente par défaut). En mode rootful avec le backend iptables legacy, le comportement se rapproche de Docker (chaînes NETAVARK-* ou CNI-* insérées dans FORWARD). Vérifier le backend actif : podman info --format '{{.Host.NetworkBackend}}'. Kubernetes kube-proxy en mode iptables génère un grand nombre de chaînes dynamiques : KUBE-SERVICES, KUBE-NODEPORTS, KUBE-FW-*, KUBE-SEP-*, insérées dans PREROUTING/OUTPUT/FORWARD. Ces règles sont régénérées en continu par kube-proxy (toutes les quelques secondes) : toute règle manuelle ajoutée directement dans les chaînes KUBE-* sera écrasée. Pour du filtrage périmétrique sur un nœud Kubernetes, préférer : des NetworkPolicies au niveau Kubernetes (si le CNI les supporte : Calico, Cilium, etc.) plutôt qu\u0026rsquo;iptables brut ; ou une chaîne personnalisée en amont (INPUT/FORWARD) explicitement non gérée par kube-proxy, avec un -j ACCEPT de retour placé avant tout DROP. Si kube-proxy tourne en mode ipvs, l\u0026rsquo;impact sur les chaînes iptables classiques est plus limité (seulement pour le NAT de certains services). Bonnes pratiques générales Toujours placer le bypass ESTABLISHED,RELATED avant toute règle de DROP basée sur set/ASN/GeoIP, dans chaque chaîne concernée (INPUT, FORWARD, DOCKER-USER). Ne jamais modifier les chaînes générées automatiquement (DOCKER, KUBE-*) — utiliser les points d\u0026rsquo;extension prévus (DOCKER-USER) ou un outillage de plus haut niveau (NetworkPolicies). Rendre les règles custom idempotentes et rejouables au boot/restart du daemon concerné, car ces outils réinitialisent leurs chaînes régulièrement. Vérifier après chaque déploiement/restart avec iptables -S DOCKER-USER (ou équivalent) que les règles perso sont toujours présentes. Généré à partir du cheatsheet iptables (Dejan Panovski, mis à jour le 9 fév. 2026), complété par les considérations Docker/Podman/Kubernetes. A titre d\u0026rsquo;indication la dernière partie traitant les cas de Podman et Kubernetes et les bonnes pratiques ont étés complétés à l\u0026rsquo;aide d\u0026rsquo;une IA.\n","permalink":"https://blog.noe-georget.fr/posts/reseau/les-commandes-iptables/","summary":"\u003cp\u003eIptables est l\u0026rsquo;outil de pare-feu Linux classique pour le filtrage, le NAT et la manipulation de paquets. Ce memo couvre les commandes les plus courantes pour inspecter les règles, autoriser ou bloquer le trafic, effectuer la redirection de ports et gérer la persistance.\u003c/p\u003e\n\u003ch2 id=\"1-consultation-des-règles\"\u003e1. Consultation des règles\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eDescription\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -L\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eLister les règles\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -L -n\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eLister sans résolution DNS\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -L -v\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSortie détaillée (compteurs, interfaces)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -L -n --line-numbers\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAfficher les numéros de règle\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -S\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAfficher les règles sous forme de commandes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -t nat -L -n -v\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eVoir les règles NAT\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"2-politiques-par-défaut\"\u003e2. Politiques par défaut\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eDescription\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -P INPUT DROP\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDrop par défaut en entrée\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -P FORWARD DROP\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDrop par défaut en forwarding\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -P OUTPUT ACCEPT\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAccept par défaut en sortie\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"3-autoriser-du-trafic\"\u003e3. Autoriser du trafic\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eDescription\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -A INPUT -i lo -j ACCEPT\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAutoriser le loopback\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAutoriser les connexions établies\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAutoriser SSH\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAutoriser HTTP\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAutoriser HTTPS\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -A INPUT -p icmp -j ACCEPT\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAutoriser le ping\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003esudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAutoriser un sous-réseau\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cblockquote\u003e\n\u003cp\u003e⚠️ La règle \u003ccode\u003eESTABLISHED,RELATED\u003c/code\u003e doit \u003cstrong\u003etoujours\u003c/strong\u003e être placée avant toute règle de DROP basée sur ipset/GeoIP/ASN, sinon le trafic retour légitime peut être coupé (cf. section Docker ci-dessous).\u003c/p\u003e","title":"Les commandes iptables"},{"content":"J\u0026rsquo;utilise presque tout le temps des clés SSH pour me connecter à mes hôtes en SSH. Mais quand une clé n\u0026rsquo;est pas (encore) configurée et que je dois me connecter par mot de passe ça se termine souvent comme ça :\nnoe@Noes-MacBook-Air \u0026gt; ~ \u0026gt; ssh ngrt@192.168.30.5 The authenticity of host \u0026#39;192.168.30.5 (192.168.30.5)\u0026#39; can\u0026#39;t be established. ED25519 key fingerprint is SHA256:RmL26XwkllwGhxKPXlyVLxrwG2UFMAm31J0zuGe5gcI. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added \u0026#39;192.168.30.5\u0026#39; (ED25519) to the list of known hosts. Received disconnect from 192.168.30.5 port 22:2: Too many authentication failures Disconnected from 192.168.30.5 port 22 Ce message signifie que mon terminal est configuré pour aller se connecter en allant chercher ses clés SSH dans mon gestionnaire de mots de passe (Vaultwarden dans mon cas) mais sauf qu\u0026rsquo;il n\u0026rsquo;y a pas encore de clé de configuré.\nPour y remédier, on peut saisir cette commande avec les options -o PreferredAuthentications=password et -o PubkeyAuthentication=no :\nssh -o PreferredAuthentications=password -o PubkeyAuthentication=no utilisateur@hote ","permalink":"https://blog.noe-georget.fr/posts/reseau/se-connecter-en-ssh-sans-cl%C3%A9s/","summary":"\u003cp\u003eJ\u0026rsquo;utilise presque tout le temps des clés SSH pour me connecter à mes hôtes en SSH. Mais quand une clé n\u0026rsquo;est pas (encore) configurée et que je dois me connecter par mot de passe ça se termine souvent comme ça :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enoe@Noes-MacBook-Air \u0026gt; ~ \u0026gt; ssh ngrt@192.168.30.5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThe authenticity of host \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;192.168.30.5 (192.168.30.5)\u0026#39;\u003c/span\u003e can\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;t be established.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eED25519 key fingerprint is SHA256:RmL26XwkllwGhxKPXlyVLxrwG2UFMAm31J0zuGe5gcI.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eThis key is not known by any other names.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eAre you sure you want to continue connecting (yes/no/[fingerprint])? yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eWarning: Permanently added \u0026#39;\u003c/span\u003e192.168.30.5\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003eED25519\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e to the list of known hosts.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReceived disconnect from 192.168.30.5 port 22:2: Too many authentication failures\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDisconnected from 192.168.30.5 port \u003cspan style=\"color:#ae81ff\"\u003e22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe message signifie que mon terminal est configuré pour aller se connecter en allant chercher ses clés SSH dans mon gestionnaire de mots de passe (Vaultwarden dans mon cas) mais sauf qu\u0026rsquo;il n\u0026rsquo;y a pas encore de clé de configuré.\u003c/p\u003e","title":"Se connecter en SSH sans clés"},{"content":"Apache Guacamole est un bastion d\u0026rsquo;administration prennant en charge les protocoles SSH, RDP et VNC. Un bastion est utile car il va permettre de centraliser ses connexions (homelab entre autres), ce qui est pratique car il nous évite d\u0026rsquo;installer sur chaque appareil un client SSH, RDP ou VNC. Seuls prérequis seront un client Tailscale et un navigateur internet (car dans ce guide on va utiliser Tailscale pour y accéder en dehors de chez soi). On est pas obligé de forcément tout centraliser dans Guacamole du sens où seule les connexions SSH ne pourront se faire seulement que dans Guacamole pas en parallèle dans un terminal ou client autre que Guacamole mais cela reste tout de même possible.\nLes fonctionnalités clés Centralisation et suivi des connexions : qui, quand, où, combien de temps, depuis où Aucun client lourd à installer, l\u0026rsquo;accès s\u0026rsquo;effectue en mode web grâce au HTML5 Authentification multi-facteurs pour l\u0026rsquo;accès aux connexions, via un code TOTP Authentification SSO, compatible avec SAML, OpenID Connect, CAS ou encore LDAP Enregistrements vidéos des sessions, c\u0026rsquo;est-à-dire quand une connexion est en cours d\u0026rsquo;utilisation Gestion des autorisations pour l\u0026rsquo;accès aux connexions, par groupes ou par utilisateurs Mise en place du serveur Guacamole sera installé pour ma part dans une machine virtuelle sous Ubuntu Server 24.04 LTS. Sous Debian 12 ça fonctionne aussi et c\u0026rsquo;est globalement la même chose.\nAu moment de rédiger cette documentation, je dédiais cette installation à Debian 13 mais au vu des difficultés rencontrées (soucis de compatibilité entre Guacamole et FreeRDP 3.x\u0026hellip;) j\u0026rsquo;ai préféré utiliser Ubuntu Server 24.04 LTS.\nConditions d\u0026rsquo;installation Dans mon cas à titre personnel Guacamole sera :\nInstallé sur Ubuntu Server 24.04.4.1 LTS Installé en version 1.6.0 (dernière version au moment de rédiger ces lignes) Tomcat en version 10.1.16 et MariaDB 10.11.14 Installation des prérequis On s\u0026rsquo;assure que le système est à jour et on installe les dépendances via cette commande là :\nsudo apt update \u0026amp;\u0026amp; sudo apt full-upgrade sudo apt-get install -y build-essential libcairo2-dev libjpeg-turbo8-dev libpng-dev libtool-bin uuid-dev libossp-uuid-dev \\ libvncserver-dev freerdp2-dev libssh2-1-dev libssl-dev libtelnet-dev libpango1.0-dev libwebsockets-dev \\ libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libvorbis-dev libwebp-dev libpulse-dev \\ tomcat10 mariadb-server nginx certbot tomcat-jakartaee-migration wget curl Jusqu\u0026rsquo;ici le serveur n\u0026rsquo;est pas encore prêt car nous n\u0026rsquo;avons pas encore installé de serveur Tomcat (et on s\u0026rsquo;en occupera après).\nCompilation du serveur Il y a une partie serveur à installer et à compiler localement sur la machine.\ncd /tmp wget https://downloads.apache.org/guacamole/1.6.0/source/guacamole-server-1.6.0.tar.gz A l\u0026rsquo;heure de rédiger ces lignes la dernière version est la 1.6.0. Toutefois cela peut changer. Pour être sur de télécharger la bonne version on se rend sur le site officiel de Guacamole.\nPour extraire le contenu du fichier compressé :\ntar -xzf guacamole-server-1.6.0.tar.gz cd guacamole-server-1.6.0/ Puis pour préparer la compilation :\nsudo ./configure --with-systemd-dir=/etc/systemd/system/ Si la sortie ressemble à ça :\n------------------------------------------------ guacamole-server version 1.6.0 ------------------------------------------------ Library status: freerdp ............. yes (2.x) pango ............... yes libavcodec .......... yes libavformat ......... yes libavutil ........... yes libssh2 ............. yes libssl .............. yes libswscale .......... yes libtelnet ........... yes libVNCServer ........ yes libvorbis ........... yes libpulse ............ yes libwebsockets ....... yes libwebp ............. yes wsock32 ............. no Protocol support: Kubernetes .... yes RDP ........... yes SSH ........... yes Telnet ........ yes VNC ........... yes Services / tools: guacd ...... yes guacenc .... yes guaclog .... yes FreeRDP plugins: /usr/lib/x86_64-linux-gnu/freerdp2 Init scripts: no Systemd units: /etc/systemd/system/ Type \u0026#34;make\u0026#34; to compile guacamole-server. C\u0026rsquo;est que Guacamole est prêt pour être compilé. En revanche si dans le support des protocoles tout n\u0026rsquo;est pas en yes c\u0026rsquo;est qu\u0026rsquo;il manque des dépendances à installer.\nOn compile :\nsudo make Et on installe :\nsudo make install Si tout s\u0026rsquo;est bien passé avec succès, on peut en conclure que la partie serveur s\u0026rsquo;est bien installée. Mais ce n\u0026rsquo;est pas encore fini il nous reste encore d\u0026rsquo;autre choses à faire.\nOn va saisir cette commande qui va mettre à jour les liens entre guacamole-server et les librairies :\nsudo ldconfig Il est normal que cette commande retourne aucun résultat.\nEnsuite, on va démarrer le service \u0026ldquo;guacd\u0026rdquo; correspondant à Guacamole et activer son démarrage automatique :\nsudo systemctl daemon-reload sudo systemctl enable --now guacd On vérifie l\u0026rsquo;état de guacd :\nsudo systemctl status guacd Déployer l\u0026rsquo;application web Guacamole L\u0026rsquo;application web est un fichier WAR qui exécute à l\u0026rsquo;intérieur un Tomcat, on va le télécharger :\ncd /tmp wget https://downloads.apache.org/guacamole/1.6.0/binary/guacamole-1.6.0.war Sous Ubuntu 24.04, Tomcat 10 utilise l\u0026rsquo;espace de noms Jakarta EE au lieu de l\u0026rsquo;ancien espace de noms javax. Le fichier WAR de Guacamole utilisant toujours javax en interne, il doit être converti. Sans cette étape, vous obtiendrez une page blanche après la connexion. Le paquet tomcat-jakartaee-migration, que vous avez installé précédemment, fournit l\u0026rsquo;outil de conversion :\nsudo javax2jakarta /tmp/guacamole-1.6.0.war /var/lib/tomcat10/webapps/guacamole.war Redémarrer Tomcat pour déployer le WAR converti :\nsudo systemctl restart tomcat10 Tomcat devrait décompresser le fichier WAR dans /var/lib/tomcat10/webapps/guacamole/ en quelques secondes.\nConfigurer MariaDB Bien que Guacamole puisse utiliser un simple fichier XML pour la gestion des utilisateurs, l\u0026rsquo;utilisation d\u0026rsquo;une base de données en arrière-plan est préférable pour un environnement de production. Cette solution offre une gestion des utilisateurs via l\u0026rsquo;interface web, le regroupement des connexions ainsi que l\u0026rsquo;historique des sessions.\nCommencez par créer la base de données et l\u0026rsquo;utilisateur :\nsudo mysql -e \u0026#34;CREATE DATABASE guacamole_db CHARACTER SET utf8mb4;\u0026#34; sudo mysql -e \u0026#34;CREATE USER \u0026#39;guacamole_user\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;MonMotDePasseSuperFort\u0026#39;;\u0026#34; sudo mysql -e \u0026#34;GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO \u0026#39;guacamole_user\u0026#39;@\u0026#39;localhost\u0026#39;;\u0026#34; sudo mysql -e \u0026#34;FLUSH PRIVILEGES;\u0026#34; ⚠ Remplacez bien MonMotDePasseSuperFort par un mot de passe robuste si cette instance sera mise en production.\nEnsuite, on va télécharger l\u0026rsquo;extension d\u0026rsquo;authentification JDBC :\ncd /tmp wget https://downloads.apache.org/guacamole/1.6.0/binary/guacamole-auth-jdbc-1.6.0.tar.gz tar -xzf guacamole-auth-jdbc-1.6.0.tar.gz Importez le schéma MySQL dans la base de données :\ncat /tmp/guacamole-auth-jdbc-1.6.0/mysql/schema/*.sql | sudo mysql guacamole_db Créez le répertoire des extensions Guacamole et convertissez le fichier JAR JDBC vers l\u0026rsquo;espace de noms Jakarta :\nsudo mkdir -p /etc/guacamole/extensions sudo javax2jakarta /tmp/guacamole-auth-jdbc-1.6.0/mysql/guacamole-auth-jdbc-mysql-1.6.0.jar /etc/guacamole/extensions/guacamole-auth-jdbc-mysql-1.6.0.jar Le fichier JAR JDBC nécessite également la conversion javax-vers-jakarta, car il s\u0026rsquo;exécute au sein de Tomcat 10. Omettre cette étape entraîne des échecs d\u0026rsquo;authentification.\nTéléchargez maintenant le pilote MySQL Connector/J pour permettre à Guacamole de communiquer avec MariaDB :\nsudo mkdir -p /etc/guacamole/lib cd /tmp wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-9.2.0.tar.gz tar -xzf mysql-connector-j-9.2.0.tar.gz sudo cp mysql-connector-j-9.2.0/mysql-connector-j-9.2.0.jar /etc/guacamole/lib/ MySQL Connector/J 9.2.0 fonctionne aussi bien avec MySQL qu\u0026rsquo;avec MariaDB.\nConfigurer guacamole.properties Guacamole lit sa configuration principale dans le fichier /etc/guacamole/guacamole.properties. Ce fichier indique à l\u0026rsquo;application web où trouver guacd et quelle base de données utiliser pour l\u0026rsquo;authentification.\necho \u0026#34;guacd-hostname: localhost guacd-port: 4822 mysql-hostname: localhost mysql-port: 3306 mysql-database: guacamole_db mysql-username: guacamole_user mysql-password: MonMotDePasseSuperFort mysql-auto-create-accounts: true\u0026#34; | sudo tee /etc/guacamole/guacamole.properties Utilisez le même mot de passe que celui défini lors de la création de l\u0026rsquo;utilisateur MariaDB.\nRestreignez les permissions du fichier, car il contient un mot de passe de base de données :\nsudo chmod 600 /etc/guacamole/guacamole.properties sudo chown tomcat:tomcat /etc/guacamole/guacamole.properties Créez un lien vers le répertoire d\u0026rsquo;accueil de Guacamole afin que Tomcat puisse le trouver :\nsudo ln -sf /etc/guacamole /var/lib/tomcat10/.guacamole Redémarrez Tomcat pour prendre en compte la nouvelle configuration :\nsudo systemctl restart tomcat10 A partir de cet instant là Guacamole est accessible dans le navigateur via le port 8080 mais seulement si on ajoute /guacamole à la fin de l\u0026rsquo;URL. On peut mettre Guacamole derrière un reverse proxy pour pouvoir afficher normalement Guacamole sans à ajouter /guacamole à chaque fois et éventuellement si il est exposé sur Internet lui attribuer un certificat SSL.\nBonus : mettre Guacamole derrière un reverse proxy avec certificat SSL Vous pouvez passer cette étape si vous ne souhaitez pas exposer Guacamole via un nom de domaine ou bien tout simplement que vous n\u0026rsquo;en possédez pas un. Si vous souhaitez tout de même y accéder en dehors de votre réseau local vous pouvez utiliser Tailscale.\nOn installe nginx via :\nsudo apt install nginx Exécuter Guacamole derrière Nginx avec un certificat SSL permet de bénéficier de connexions chiffrées et de le rendre accessible via une URL propre, sans le suffixe de chemin \u0026ldquo;/guacamole\u0026rdquo;. Commencez par obtenir un certificat Let’s Encrypt via cette commande :\nsudo certbot certonly --standalone -d guacamole.domaine.fr --non-interactive --agree-tos -m mail@domaine.fr Remplacez guacamole.domaine.fr par votre véritable nom de domaine. Certbot a besoin que le port 80 soit libre donc par conséquent, arrêtez temporairement Nginx s\u0026rsquo;il est déjà en cours d\u0026rsquo;exécution (sudo systemctl stop nginx) avant de lancer Certbot.\nCréez la configuration de l\u0026rsquo;hôte virtuel Nginx :\nsudo vim /etc/nginx/sites-available/guacamole Ajoutez la configuration suivante. Les en-têtes WebSocket sont importantes car Guacamole utilise des WebSocket pour le tunnel du bureau distant :\nserver { listen 443 ssl http2; server_name guacamole.domaine.fr; ssl_certificate /etc/letsencrypt/live/guacamole.domaine.fr/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/guacamole.domaine.fr/privkey.pem; location / { proxy_pass http://127.0.0.1:8080/guacamole/; proxy_buffering off; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_cookie_path /guacamole/ /; } } server { listen 80; server_name guacamole.domaine.fr; return 301 https://$host$request_uri; } Activez le site et testez la configuration :\nsudo ln -sf /etc/nginx/sites-available/guacamole /etc/nginx/sites-enabled/ sudo rm -f /etc/nginx/sites-enabled/default sudo nginx -t Si le resultat de la commande sudo nginx -t ne retourne aucune erreur alors démarrez Nginx :\nsudo systemctl enable --now nginx Si vous avez un pare-feu sur votre système :\nsudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw reload Vérifiez que le renouvellement automatique du certificat fonctionne :\nsudo certbot renew --dry-run Apache Guacamole fonctionne dés à présent accessible via https://guacamole.domaine.fr.\nBien évidemment il s\u0026rsquo;agit d\u0026rsquo;un domaine fictif donc cela devrait fonctionner depuis votre nom de domaine ou adresse IP locale.\nCréer un utilisateur Par défaut le nom d\u0026rsquo;utilisateur et le mot de passe pour se connecter est guacadmin, il est recommandé de changer le mot de passe du compte ou de le désactiver puis par la suite de créer un utilisateur administrateur. Pensez à créer un utilisateur qui possède le rôle d\u0026rsquo;administrateur avant de désactiver guacadmin si vous comptez le faire. En ce qui est de la création de compte, le formulaire est assez complet puisque vous avez la possiblité d\u0026rsquo;y ajouter des restrictions au niveau du compte comme :\nforcer l\u0026rsquo;expiration du mot de passe qui va inviter l\u0026rsquo;utilisateur à le changer autoriser l\u0026rsquo;accès au compte pendant une plage horaire donnée activer et désactiver le compte pendant une plage horaire donnée modifier son fuseau horaire Ainsi que des permissions :\nAdministration du système Audit system Créer de nouveaux utilisateurs Créer de nouveaux groupes d\u0026rsquo;utilisateurs Créer de nouvelles connexions Créer de nouveaux groupes de connexion Créer de nouveaux profils de partage Modifier son propre mot de passe Audit system : est une option permettant la traçabilité des évènements lié à l\u0026rsquo;utilisation de Guacamole sous un compte où l\u0026rsquo;option est activée. Les évènements enregistrés sont les connexions et déconnexions des utilisateurs, les tentatives d\u0026rsquo;authentification (réussies ou échouées), l\u0026rsquo;ouverture et la fermeture de sessions RDP, SSH ou VNC. les modifications de la configuration (création/suppression de connexions, changements de groupes, permissions, etc.) et les opérations d\u0026rsquo;administration (création d\u0026rsquo;utilisateurs, modification des droits, etc.).\nAjouter un hôte Pour ajouter un hôte SSH, il faut se rendre dans le menu en haut à droite en cliquant sur l\u0026rsquo;utilisateur puis dans le menu qui se déroule il faut cliquer sur Paramètres. Dans cette section se trouve différents onglets et celui qui nous intéresse est Connexions.\nEt on clique sur Nouvelle connexion. Par ailleurs il y a aussi possibilité de créer un groupe de connexions avec possibilité là encore d\u0026rsquo;ajouter des limites :\nNombre maximum de connexions Nombre maximum de connexions par utilisateur Activer l\u0026rsquo;affinité de session Pour ajouter un hôte il y a de nombreuses options qui sont à notre disposition. l\u0026rsquo;authentification par clé SSH est possible. Vous avez également possibilité de faire du Wake On LAN.\nDocumentation d\u0026rsquo;Apache Guacamole\n","permalink":"https://blog.noe-georget.fr/posts/systemes/installer-apache-guacamole-sur-ubuntu-server-2404/","summary":"\u003cp\u003eApache Guacamole est un bastion d\u0026rsquo;administration prennant en charge les protocoles SSH, RDP et VNC. Un bastion est utile car il va permettre de centraliser ses connexions (homelab entre autres), ce qui est pratique car il nous évite d\u0026rsquo;installer sur chaque appareil un client SSH, RDP ou VNC. Seuls prérequis seront un client Tailscale et un navigateur internet (car dans ce guide on va utiliser Tailscale pour y accéder en dehors de chez soi). On est pas obligé de forcément tout centraliser dans Guacamole du sens où seule les connexions SSH ne pourront se faire seulement que dans Guacamole pas en parallèle dans un terminal ou client autre que Guacamole mais cela reste tout de même possible.\u003c/p\u003e","title":"Installer Apache Guacamole sur Ubuntu Server 24.04"},{"content":"Homebrew est un fabuleux gestionnaire de paquets pour macOS et Linux. Les commandes sont simples à prendre en main. Dans cette publication je vais montrer les différentes commandes que brew possède et à quoi elles servent.\nInformations Commande Explication brew --version Affiche la version de Homebrew brew config Affiche la configuration complète de Homebrew brew doctor Vérifie l\u0026rsquo;installation et détecte les problèmes courants brew help Affiche l\u0026rsquo;aide man brew Manuel complet des commandes Rechercher un paquet Commande Explication brew search \u0026lt;nom\u0026gt; Recherche une formule ou un cask brew search --desc \u0026lt;mot-clé\u0026gt; Recherche dans les descriptions des paquets Installer une formule (CLI) Commande Explication brew install \u0026lt;package\u0026gt; Installe une formule brew reinstall \u0026lt;package\u0026gt; Réinstalle une formule brew install --formula \u0026lt;package\u0026gt; Force l\u0026rsquo;installation en tant que formule Installer une application graphique (Cask) Commande Explication brew install --cask \u0026lt;application\u0026gt; Installe une application graphique brew reinstall --cask \u0026lt;application\u0026gt; Réinstalle une application graphique Désinstaller Commande Explication brew uninstall \u0026lt;package\u0026gt; Désinstalle une formule brew uninstall --cask \u0026lt;application\u0026gt; Désinstalle une application graphique brew uninstall --force \u0026lt;package\u0026gt; Force la désinstallation Mettre à jour Commande Explication brew update Met à jour Homebrew et les dépôts brew upgrade Met à jour tous les paquets installés brew upgrade \u0026lt;package\u0026gt; Met à jour un paquet spécifique Vérifier les mises à jour Commande Explication brew outdated Liste les paquets ayant une mise à jour disponible brew outdated \u0026lt;package\u0026gt; Vérifie un paquet spécifique Nettoyage Commande Explication brew autoremove Supprime les dépendances devenues inutiles brew cleanup Supprime les anciennes versions et nettoie le cache brew cleanup --dry-run Simule le nettoyage brew cleanup --prune=all Nettoyage complet du cache Lister les paquets Commande Explication brew list Liste tous les paquets installés brew list --formula Liste uniquement les formules brew list --cask Liste uniquement les applications brew list --versions Affiche les versions installées brew leaves Liste les paquets installés explicitement Informations sur un paquet Commande Explication brew info \u0026lt;package\u0026gt; Informations détaillées sur une formule brew info --cask \u0026lt;application\u0026gt; Informations sur une application brew desc \u0026lt;package\u0026gt; Description courte brew home \u0026lt;package\u0026gt; Ouvre le site officiel brew log \u0026lt;package\u0026gt; Historique Git de la formule brew cat \u0026lt;package\u0026gt; Affiche le contenu de la formule brew edit \u0026lt;package\u0026gt; Ouvre la formule dans l\u0026rsquo;éditeur Dépendances Commande Explication brew deps \u0026lt;package\u0026gt; Liste les dépendances directes brew deps --tree \u0026lt;package\u0026gt; Affiche l\u0026rsquo;arbre des dépendances brew deps --installed --tree Arbre des dépendances des paquets installés brew uses \u0026lt;package\u0026gt; Liste les paquets dépendant de cette formule Services Commande Explication brew services list Liste les services brew services start \u0026lt;service\u0026gt; Démarre un service brew services stop \u0026lt;service\u0026gt; Arrête un service brew services restart \u0026lt;service\u0026gt; Redémarre un service brew services run \u0026lt;service\u0026gt; Lance le service sans l\u0026rsquo;enregistrer au démarrage Liens symboliques Commande Explication brew link \u0026lt;package\u0026gt; Crée les liens symboliques brew unlink \u0026lt;package\u0026gt; Supprime les liens symboliques brew link --overwrite \u0026lt;package\u0026gt; Écrase les liens existants brew link --force \u0026lt;package\u0026gt; Force la création des liens Télécharger une formule Commande Explication brew fetch \u0026lt;package\u0026gt; Télécharge la formule sans l\u0026rsquo;installer brew fetch --force \u0026lt;package\u0026gt; Force un nouveau téléchargement Vérification et tests Commande Explication brew audit \u0026lt;package\u0026gt; Vérifie la conformité d\u0026rsquo;une formule brew test \u0026lt;package\u0026gt; Lance les tests de la formule Gestion des taps Commande Explication brew tap Liste les taps installés brew tap \u0026lt;utilisateur/dépôt\u0026gt; Ajoute un tap brew untap \u0026lt;utilisateur/dépôt\u0026gt; Supprime un tap Brew Bundle Commande Explication brew bundle Installe les paquets du Brewfile brew bundle dump Génère un Brewfile à partir du système brew bundle check Vérifie si tout est installé brew bundle cleanup Supprime les paquets absents du Brewfile Emplacements Commande Explication brew --prefix Préfixe d\u0026rsquo;installation de Homebrew brew --prefix \u0026lt;package\u0026gt; Préfixe d\u0026rsquo;une formule brew --cellar Répertoire Cellar brew --repository Répertoire Git de Homebrew brew --cache Répertoire du cache brew --cache \u0026lt;package\u0026gt; Cache d\u0026rsquo;une formule Diagnostic Commande Explication brew doctor Vérifie l\u0026rsquo;état de Homebrew brew missing Recherche les dépendances manquantes brew config Informations système utiles au diagnostic Gestion des versions Commande Explication brew list --versions Affiche les versions installées brew pin \u0026lt;package\u0026gt; Empêche la mise à jour d\u0026rsquo;un paquet brew unpin \u0026lt;package\u0026gt; Autorise de nouveau les mises à jour Mise à jour complète du système Commande Explication brew update \u0026amp;\u0026amp; brew upgrade \u0026amp;\u0026amp; brew autoremove \u0026amp;\u0026amp; brew cleanup \u0026amp;\u0026amp; brew doctor Met à jour Homebrew, les paquets, supprime les dépendances inutiles, nettoie le cache et vérifie l\u0026rsquo;installation Architecture Information Valeur Apple Silicon /opt/homebrew Intel /usr/local Commandes les plus utilisées Action Commande Installer une formule brew install \u0026lt;package\u0026gt; Installer une application brew install --cask \u0026lt;application\u0026gt; Rechercher un paquet brew search \u0026lt;nom\u0026gt; Afficher les informations brew info \u0026lt;package\u0026gt; Lister les paquets brew list Vérifier les mises à jour brew outdated Mettre à jour Homebrew brew update Mettre à jour les paquets brew upgrade Désinstaller brew uninstall \u0026lt;package\u0026gt; Nettoyer brew cleanup Supprimer les dépendances inutiles brew autoremove Vérifier l\u0026rsquo;installation brew doctor Gérer les services brew services list ","permalink":"https://blog.noe-georget.fr/posts/systemes/les-commandes-brew/","summary":"\u003cp\u003eHomebrew est un fabuleux gestionnaire de paquets pour macOS et Linux. Les commandes sont simples à prendre en main. Dans cette publication je vais montrer les différentes commandes que brew possède et à quoi elles servent.\u003c/p\u003e\n\u003ch2 id=\"informations\"\u003eInformations\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew --version\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAffiche la version de Homebrew\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew config\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAffiche la configuration complète de Homebrew\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew doctor\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eVérifie l\u0026rsquo;installation et détecte les problèmes courants\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew help\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAffiche l\u0026rsquo;aide\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003eman brew\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eManuel complet des commandes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"rechercher-un-paquet\"\u003eRechercher un paquet\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew search \u0026lt;nom\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRecherche une formule ou un cask\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew search --desc \u0026lt;mot-clé\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRecherche dans les descriptions des paquets\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"installer-une-formule-cli\"\u003eInstaller une formule (CLI)\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew install \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eInstalle une formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew reinstall \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRéinstalle une formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew install --formula \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eForce l\u0026rsquo;installation en tant que formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"installer-une-application-graphique-cask\"\u003eInstaller une application graphique (Cask)\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew install --cask \u0026lt;application\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eInstalle une application graphique\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew reinstall --cask \u0026lt;application\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRéinstalle une application graphique\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"désinstaller\"\u003eDésinstaller\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew uninstall \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDésinstalle une formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew uninstall --cask \u0026lt;application\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDésinstalle une application graphique\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew uninstall --force \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eForce la désinstallation\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"mettre-à-jour\"\u003eMettre à jour\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew update\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMet à jour Homebrew et les dépôts\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew upgrade\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMet à jour tous les paquets installés\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew upgrade \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMet à jour un paquet spécifique\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"vérifier-les-mises-à-jour\"\u003eVérifier les mises à jour\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew outdated\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe les paquets ayant une mise à jour disponible\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew outdated \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eVérifie un paquet spécifique\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"nettoyage\"\u003eNettoyage\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew autoremove\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSupprime les dépendances devenues inutiles\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew cleanup\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSupprime les anciennes versions et nettoie le cache\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew cleanup --dry-run\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSimule le nettoyage\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew cleanup --prune=all\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eNettoyage complet du cache\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"lister-les-paquets\"\u003eLister les paquets\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew list\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe tous les paquets installés\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew list --formula\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe uniquement les formules\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew list --cask\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe uniquement les applications\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew list --versions\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAffiche les versions installées\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew leaves\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe les paquets installés explicitement\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"informations-sur-un-paquet\"\u003eInformations sur un paquet\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew info \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eInformations détaillées sur une formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew info --cask \u0026lt;application\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eInformations sur une application\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew desc \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDescription courte\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew home \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOuvre le site officiel\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew log \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eHistorique Git de la formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew cat \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAffiche le contenu de la formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew edit \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOuvre la formule dans l\u0026rsquo;éditeur\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"dépendances\"\u003eDépendances\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew deps \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe les dépendances directes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew deps --tree \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAffiche l\u0026rsquo;arbre des dépendances\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew deps --installed --tree\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eArbre des dépendances des paquets installés\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew uses \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe les paquets dépendant de cette formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"services\"\u003eServices\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew services list\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe les services\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew services start \u0026lt;service\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDémarre un service\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew services stop \u0026lt;service\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eArrête un service\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew services restart \u0026lt;service\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRedémarre un service\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew services run \u0026lt;service\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eLance le service sans l\u0026rsquo;enregistrer au démarrage\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"liens-symboliques\"\u003eLiens symboliques\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew link \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eCrée les liens symboliques\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew unlink \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSupprime les liens symboliques\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew link --overwrite \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eÉcrase les liens existants\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew link --force \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eForce la création des liens\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"télécharger-une-formule\"\u003eTélécharger une formule\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew fetch \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eTélécharge la formule sans l\u0026rsquo;installer\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew fetch --force \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eForce un nouveau téléchargement\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"vérification-et-tests\"\u003eVérification et tests\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew audit \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eVérifie la conformité d\u0026rsquo;une formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew test \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eLance les tests de la formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"gestion-des-taps\"\u003eGestion des taps\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew tap\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eListe les taps installés\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew tap \u0026lt;utilisateur/dépôt\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAjoute un tap\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew untap \u0026lt;utilisateur/dépôt\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSupprime un tap\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"brew-bundle\"\u003eBrew Bundle\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew bundle\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eInstalle les paquets du Brewfile\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew bundle dump\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eGénère un Brewfile à partir du système\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew bundle check\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eVérifie si tout est installé\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew bundle cleanup\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSupprime les paquets absents du Brewfile\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"emplacements\"\u003eEmplacements\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew --prefix\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePréfixe d\u0026rsquo;installation de Homebrew\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew --prefix \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePréfixe d\u0026rsquo;une formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew --cellar\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRépertoire Cellar\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew --repository\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRépertoire Git de Homebrew\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew --cache\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRépertoire du cache\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew --cache \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eCache d\u0026rsquo;une formule\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"diagnostic\"\u003eDiagnostic\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew doctor\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eVérifie l\u0026rsquo;état de Homebrew\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew missing\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eRecherche les dépendances manquantes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew config\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eInformations système utiles au diagnostic\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"gestion-des-versions\"\u003eGestion des versions\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew list --versions\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAffiche les versions installées\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew pin \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEmpêche la mise à jour d\u0026rsquo;un paquet\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew unpin \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAutorise de nouveau les mises à jour\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"mise-à-jour-complète-du-système\"\u003eMise à jour complète du système\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eExplication\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew update \u0026amp;\u0026amp; brew upgrade \u0026amp;\u0026amp; brew autoremove \u0026amp;\u0026amp; brew cleanup \u0026amp;\u0026amp; brew doctor\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMet à jour Homebrew, les paquets, supprime les dépendances inutiles, nettoie le cache et vérifie l\u0026rsquo;installation\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"architecture\"\u003eArchitecture\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eInformation\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eValeur\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eApple Silicon\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003e/opt/homebrew\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eIntel\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003e/usr/local\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"commandes-les-plus-utilisées\"\u003eCommandes les plus utilisées\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eAction\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eCommande\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eInstaller une formule\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew install \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eInstaller une application\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew install --cask \u0026lt;application\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eRechercher un paquet\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew search \u0026lt;nom\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAfficher les informations\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew info \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLister les paquets\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew list\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVérifier les mises à jour\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew outdated\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMettre à jour Homebrew\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew update\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMettre à jour les paquets\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew upgrade\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eDésinstaller\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew uninstall \u0026lt;package\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eNettoyer\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew cleanup\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSupprimer les dépendances inutiles\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew autoremove\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVérifier l\u0026rsquo;installation\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew doctor\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eGérer les services\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ccode\u003ebrew services list\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e","title":"Les commandes Brew"},{"content":"Quand on administre un serveur sous Linux, il se peut que le système accumule des fichiers très volumineux tel que des caches, des paquets orphelins ou encore pour les utilisateurs de Docker des images inutilisées ou des volumes indépendants qui est assigné à aucun conteneur.\nUne simple commande existe pour vérifier quel dossier prend le plus de place :\nsudo du -hs /* |sort -h|tail -5 Cette commande va analyser entièrement la partition racine / puis va afficher les 5 dossiers qui occupent le plus la racine.\nSortie :\n195M\t/docker 501M\t/opt 1.6G\t/usr 41G\t/var 281G\t/mnt Dans mon cas, /mnt est un dossier qui comporte des points de montage sur des disques dur. Il est normal que sa taille soit énorme en fonction de ce qui est stocké.\nIl est possible d\u0026rsquo;aller plus loin par exemple, si je veux voir ce qui prend le plus de place dans /var. La commande va devenir :\nsudo du -hs /var/* |sort -h|tail -5 Sortie :\n28K\t/var/tmp 1.5M\t/var/backups 126M\t/var/log 188M\t/var/cache 40G\t/var/lib Et ainsi de suite\u0026hellip;\n","permalink":"https://blog.noe-georget.fr/posts/systemes/voir-sur-linux-quel-dossier-prend-le-plus-de-place/","summary":"\u003cp\u003eQuand on administre un serveur sous Linux, il se peut que le système accumule des fichiers très volumineux tel que des caches, des paquets orphelins ou encore pour les utilisateurs de Docker des images inutilisées ou des volumes indépendants qui est assigné à aucun conteneur.\u003c/p\u003e\n\u003cp\u003eUne simple commande existe pour vérifier quel dossier prend le plus de place :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo du -hs /* |sort -h|tail -5\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCette commande va analyser entièrement la partition racine \u003ccode\u003e/\u003c/code\u003e puis va afficher les 5 dossiers qui occupent le plus la racine.\u003c/p\u003e","title":"Voir Sur Linux Quel Dossier Prend Le Plus De Place"}]