Retour aux mises à jour
New releaseSep 3, 2026

sshconfig-lint v0.5.0

Linter basé sur des règles pour les fichiers de configuration du client OpenSSH qui détecte les hôtes en double, les fichiers d'identité manquants, les algorithmes faibles, les problèmes d'ordre des jokers et les paramètres dangereux avec sortie JSON et codes de sortie adaptés à CI.

Partager

sshconfig-lint

Tests crates.io License: MIT

Un seul moteur pour tous les endroits où votre configuration SSH change.

sshconfig-lint détecte les erreurs sémantiques dans les configurations client OpenSSH : hôtes en double, chemins d'identité cassés, options dangereuses, algorithmes faibles, ordre des jokers et chaînes Include emmêlées. Utilisez les mêmes codes de règle en local, dans les hooks Git, GitHub Actions et les éditeurs.

Essayez le playground privé dans le navigateur · Apprenez avec des exemples interactifs · Lisez toutes les règles

Le vérificateur dans le navigateur s'exécute sur votre appareil. Le contenu des configurations n'est pas téléversé et aucune télémétrie n'est collectée.

Démarrage rapide

# check ~/.ssh/config
sshconfig-lint

# check one or more repository configs
sshconfig-lint .ssh/config infrastructure/ssh_config

# fail on warnings and errors
sshconfig-lint .ssh/config --strict

Installation

Homebrew

brew tap Noah4ever/tap
brew install sshconfig-lint

Cargo

cargo install sshconfig-lint

Arch Linux

yay -S sshconfig-lint-bin

La page des versions fournit des binaires vérifiés pour Linux, macOS et Windows. L'installateur de commodité vérifie la somme de contrôle de la version avant l'installation :

curl -fsSL https://raw.githubusercontent.com/Noah4ever/sshconfig-lint/main/install.sh | bash

Définissez VERSION=v0.5.0 ou INSTALL_DIR=~/.local/bin pour remplacer les valeurs par défaut.

GitHub Actions

L'Action officielle est disponible dans le GitHub Marketplace.

name: SSH config
on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Noah4ever/[email protected]
        with:
          paths: |
            .ssh/config
            infrastructure/ssh_config
          strict: true

Les résultats apparaissent sous forme d'annotations sur le fichier et la ligne exacts. L'Action télécharge la version correspondant à son tag et vérifie SHA256SUMS avant l'exécution.

Pour les dépôts avec GitHub Code Scanning activé, SARIF peut être téléversé séparément :

- run: sshconfig-lint .ssh/config --format sarif > sshconfig-lint.sarif
- uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: sshconfig-lint.sarif

Pre-Commit

repos:
  - repo: https://github.com/Noah4ever/sshconfig-lint
    rev: v1.0.0
    hooks:
      - id: sshconfig-lint-strict

Utilisez id: sshconfig-lint lorsque les avertissements ne doivent pas bloquer un commit. Remplacez files: dans votre projet lorsque les configurations utilisent une autre convention de nommage.

Éditeurs

VS Code

Installez l'extension VS Code depuis le Marketplace ou exécutez :

code --install-extension NoahThiering.sshconfig-lint

L'extension démarre sshconfig-lint lsp, télécharge une fois un binaire vérifié correspondant, puis fonctionne hors ligne. Elle reconnaît .ssh/config, ssh_config et dot_ssh/config de chezmoi. Aucune télémétrie n'est collectée. Son code source est disponible dans editors/vscode.

Neovim

L'exemple testé editors/neovim utilise le client LSP intégré de Neovim. Copiez son petit module Lua dans votre configuration et démarrez-le avec :

require("sshconfig_lint").setup()

Il utilise le même serveur sshconfig-lint lsp que VS Code et prend en charge un chemin de binaire personnalisé.

Tout éditeur prenant en charge le LSP peut démarrer :

sshconfig-lint lsp

Le serveur de langage v0.5 publie des diagnostics sur toute la ligne à l'ouverture, à la modification et à l'enregistrement. Les tampons non enregistrés exécutent uniquement les règles de contenu ; les fichiers enregistrés résolvent en plus les Include et les chemins du système de fichiers. Les résultats provenant d'Includes imbriqués sont attachés au fichier inclus et effacés avec le document racine.

Formats de sortie

sshconfig-lint --format text
sshconfig-lint --format json
sshconfig-lint --format github
sshconfig-lint --format sarif

Les résultats JSON contiennent severity, code, rule, line, file, message, hint et documentation. Les codes de règle et les codes de sortie sont des interfaces d'automatisation stables.

SortieSignification
0Aucun résultat de niveau erreur, et aucun avertissement avec --strict
1Au moins un résultat bloquant
2Au moins une configuration demandée n'a pas pu être lue

Règles

CodeRègleSévérité
INVALID_VALUEValeur de directive invalideerror
DUP_HOSTBloc Host en doublewarning
MISSING_IDENTITYIdentityFile introuvableerror
WILDCARD_ORDEROrdre des jokers Hostwarning
WEAK_ALGOAlgorithme faiblewarning
DUP_DIRECTIVEDirective en doublewarning
INSECURE_OPTOption non sécuriséewarning
UNSAFE_CTRL_PATHControlPath non sécuriséwarning
INCLUDE_CYCLECycle d'Includeerror
INCLUDE_DEPTHImbrication d'Include trop profondeerror
INCLUDE_READInclude illisibleerror
INCLUDE_GLOBMotif Include invalideerror
INCLUDE_NO_MATCHInclude ne correspond à aucun fichierinfo
NEGATED_HOSTHost ne contient que des motifs niéswarning
PROXY_CONFLICTConflit entre ProxyCommand et ProxyJumpwarning
REVOKED_HOST_KEYS_UNREADABLELe fichier RevokedHostKeys est illisibleerror
MISSING_CERTIFICATECertificateFile introuvableerror
LOCAL_COMMAND_DISABLEDLocalCommand n'est pas activéwarning
INVALID_TOKENJeton de pourcentage invalideerror
INVALID_SYNTAXSyntaxe invalideerror
UNKNOWN_DIRECTIVEDirective inconnueerror
DEPRECATED_OPTIONOption obsolètewarning
INVALID_MATCHCondition Match invalideerror
CONTROL_PERSIST_UNUSEDControlPersist sans ControlMasterwarning
UPDATE_HOSTKEYS_ASK_PERSISTUpdateHostKeys ask avec ControlPersistwarning

Les guides de règles montrent le fragment cassé exact, une configuration corrigée, pourquoi cela compte et comment vérifier le résultat avec OpenSSH.

INVALID_VALUE vérifie les ports, les compteurs de tentatives et d'invites, les paramètres alive, ForwardX11Timeout, RequiredRSASize, ControlPersist, les commutateurs booléens, ObscureKeystrokeTiming, les valeurs de temps OpenSSH, StreamLocalBindMask, IPQoS et les ensembles de valeurs documentés tels que AddressFamily, ControlMaster, StrictHostKeyChecking, LogLevel et PubkeyAuthentication. Les valeurs entre guillemets et insensibles à la casse acceptées par OpenSSH restent valides. Le linter accepte la syntaxe moderne sans tenter de déduire la version du client SSH qui consommera la configuration.

Les vérifications du système de fichiers ignorent les chemins contenant des jetons de pourcentage ou des variables d'environnement, car leur valeur finale dépend du contexte de connexion. LOCAL_COMMAND_DISABLED est également prudent : il est supprimé lorsqu'un Include non résolu ou tout PermitLocalCommand yes possible pourrait rendre la commande effective. Résolvez les Includes via la CLI normale ou un document d'éditeur enregistré pour un résultat plus précis.

Développement

Nécessite Rust 1.85 ou plus récent.

cargo test --all
cargo clippy --all-targets --all-features -- -D warnings
cargo fmt -- --check

Voir CONTRIBUTING.md, la feuille de route publique, le contrat de stabilité v1 et la politique de sécurité.

Licence

MIT

Catégories