Torna agli aggiornamenti
New releaseSep 3, 2026

sshconfig-lint v0.5.0

Linter basato su regole per i file di configurazione del client OpenSSH che rileva host duplicati, file di identità mancanti, algoritmi deboli, problemi di ordinamento dei wildcard e impostazioni pericolose, con output JSON e codici di uscita compatibili con CI.

Condividi

sshconfig-lint

Tests crates.io License: MIT

Un unico motore per ogni luogo in cui cambia la tua configurazione SSH.

sshconfig-lint individua errori semantici nelle configurazioni del client OpenSSH: host duplicati, percorsi delle identità non validi, opzioni non sicure, algoritmi deboli, ordinamento dei wildcard e catene di Include intricate. Usa gli stessi codici delle regole in locale, negli hook Git, in GitHub Actions e negli editor.

Prova il playground privato nel browser · Impara con esempi interattivi · Leggi tutte le regole

Il verificatore nel browser viene eseguito sul tuo dispositivo. Il contenuto della configurazione non viene caricato e non viene raccolta alcuna telemetria.

Avvio rapido

# 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

Installazione

Homebrew

brew tap Noah4ever/tap
brew install sshconfig-lint

Cargo

cargo install sshconfig-lint

Arch Linux

yay -S sshconfig-lint-bin

La pagina delle release fornisce binari verificati per Linux, macOS e Windows. L'installer di comodo verifica il checksum della release prima di installare:

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

Imposta VERSION=v0.5.0 o INSTALL_DIR=~/.local/bin per sovrascrivere i valori predefiniti.

GitHub Actions

L'Action ufficiale è disponibile nel 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

I risultati appaiono come annotazioni sul file e sulla riga esatti. L'Action scarica la release corrispondente al suo tag e verifica SHA256SUMS prima dell'esecuzione.

Per i repository con GitHub Code Scanning abilitato, SARIF può essere caricato separatamente:

- 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

Usa id: sshconfig-lint quando gli avvisi non devono bloccare un commit. Sovrascrivi files: nel tuo progetto quando le configurazioni usano una convenzione di denominazione diversa.

Editor

VS Code

Installa l'estensione VS Code dal Marketplace oppure esegui:

code --install-extension NoahThiering.sshconfig-lint

L'estensione avvia sshconfig-lint lsp, scarica una volta un binario verificato corrispondente e poi funziona offline. Riconosce .ssh/config, ssh_config e dot_ssh/config di chezmoi. Non viene raccolta alcuna telemetria. Il suo codice sorgente è disponibile in editors/vscode.

Neovim

L'esempio testato editors/neovim usa il client LSP integrato di Neovim. Copia il suo piccolo modulo Lua nella tua configurazione e avvialo con:

require("sshconfig_lint").setup()

Usa lo stesso server sshconfig-lint lsp di VS Code e supporta un percorso personalizzato del binario.

Qualsiasi editor con supporto LSP può avviare:

sshconfig-lint lsp

Il language server v0.5 pubblica diagnostiche sull'intera riga all'apertura, alla modifica e al salvataggio. I buffer senza titolo eseguono solo le regole sul contenuto; i file salvati risolvono inoltre Include e i percorsi del filesystem. I risultati degli Include annidati vengono associati al file incluso e cancellati con il documento radice.

Formati di output

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

I risultati JSON contengono severity, code, rule, line, file, message, hint e documentation. I codici delle regole e i codici di uscita sono interfacce di automazione stabili.

ExitSignificato
0Nessun risultato a livello di errore e nessun avviso con --strict
1Almeno un risultato bloccante
2Almeno una configurazione richiesta non è stata letta

Regole

CodiceRegolaGravità
INVALID_VALUEValore della direttiva non validoerror
DUP_HOSTBlocco Host duplicatowarning
MISSING_IDENTITYIdentityFile non trovatoerror
WILDCARD_ORDEROrdine dei wildcard Hostwarning
WEAK_ALGOAlgoritmo debolewarning
DUP_DIRECTIVEDirettiva duplicatawarning
INSECURE_OPTOpzione non sicurawarning
UNSAFE_CTRL_PATHControlPath non sicurowarning
INCLUDE_CYCLECiclo di Includeerror
INCLUDE_DEPTHAnnidamento di Include troppo profondoerror
INCLUDE_READImpossibile leggere Includeerror
INCLUDE_GLOBPattern Include non validoerror
INCLUDE_NO_MATCHInclude non corrisponde a nessun fileinfo
NEGATED_HOSTHost ha solo pattern negatiwarning
PROXY_CONFLICTConflitto tra ProxyCommand e ProxyJumpwarning
REVOKED_HOST_KEYS_UNREADABLEIl file RevokedHostKeys non è leggibileerror
MISSING_CERTIFICATECertificateFile non trovatoerror
LOCAL_COMMAND_DISABLEDLocalCommand non è abilitatowarning
INVALID_TOKENToken percentuale non validoerror
INVALID_SYNTAXSintassi non validaerror
UNKNOWN_DIRECTIVEDirettiva sconosciutaerror
DEPRECATED_OPTIONOpzione deprecatawarning
INVALID_MATCHCondizione Match non validaerror
CONTROL_PERSIST_UNUSEDControlPersist senza ControlMasterwarning
UPDATE_HOSTKEYS_ASK_PERSISTUpdateHostKeys ask con ControlPersistwarning

Le guide delle regole mostrano il frammento errato esatto, una configurazione corretta, perché è importante e come verificare il risultato con OpenSSH.

INVALID_VALUE controlla porte, contatori di retry e prompt, impostazioni alive, ForwardX11Timeout, RequiredRSASize, ControlPersist, switch booleani, ObscureKeystrokeTiming, valori temporali di OpenSSH, StreamLocalBindMask, IPQoS e insiemi di valori documentati come AddressFamily, ControlMaster, StrictHostKeyChecking, LogLevel e PubkeyAuthentication. I valori tra virgolette e senza distinzione tra maiuscole e minuscole accettati da OpenSSH rimangono validi. Il linter accetta la sintassi moderna senza cercare di dedurre la versione del client SSH che consumerà la configurazione.

I controlli sul filesystem saltano i percorsi che contengono token percentuali o variabili d'ambiente perché il loro valore finale dipende dal contesto della connessione. LOCAL_COMMAND_DISABLED è analogamente conservativo: viene soppresso quando un Include non risolto o un possibile PermitLocalCommand yes potrebbe rendere effettivo il comando. Risolvi gli Include tramite la normale CLI o un documento dell'editor salvato per il risultato più preciso.

Sviluppo

Richiede Rust 1.85 o successivo.

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

Vedi CONTRIBUTING.md, la roadmap pubblica, il contratto di stabilità v1 e la politica di sicurezza.

Licenza

MIT

Categorie