
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.
Esegui il lint del tuo ~/.ssh/config per errori comuni.
Controlla la presenza di blocchi host duplicati, file identity mancanti, problemi di ordinamento dei wildcard, algoritmi deboli, direttive duplicate e altro. Supporta le direttive Include con rilevamento dei cicli.
https://github.com/user-attachments/assets/4d995679-baed-4f20-9ba8-8f3ec94c64fd
curl -fsSL https://raw.githubusercontent.com/Noah4ever/sshconfig-lint/main/install.sh | bash
Imposta VERSION=v0.1.0 o INSTALL_DIR=~/.local/bin per sovrascrivere i valori predefiniti.
brew tap Noah4ever/tap
brew install sshconfig-lint
opzionale: untap Noah4ever/tap per rimuovere il tap e mantenere pulita la lista dei tap
cargo install sshconfig-lint
sshconfig-lint-bin - binari precompilati
yay -S sshconfig-lint-bin
paru -S sshconfig-lint-bin
Scarica un binario dalla pagina delle release.
# lint the default ~/.ssh/config
sshconfig-lint
# lint a specific file
sshconfig-lint --config /path/to/config
# json output
sshconfig-lint --format json
# treat warnings as errors (useful in CI)
sshconfig-lint --strict
# skip Include resolution
sshconfig-lint --no-includes
line 4: [warning] WILDCARD_ORDER (wildcard-host-order) Host 'github.com' appears after 'Host *' (line 1); it will never match because Host * already matched (hint: move Host * to the end of the file)
line 7: [warning] DUP_HOST (duplicate-host) duplicate Host block 'github.com' (first seen at line 4) (hint: remove one of the duplicate Host blocks)
line 3: [error] MISSING_IDENTITY (identity-file-exists) IdentityFile not found: ~/.ssh/id_missing (hint: check the path or remove the directive)
L'output è ordinato per file e numero di riga, quindi è deterministico tra le esecuzioni (stabile per diff e snapshot CI).
Gli errori sono rossi, gli avvisi gialli, le informazioni ciano. I colori vengono disattivati automaticamente quando stdout non è un terminale o quando NO_COLOR è impostato.
| Codice | Significato |
|---|---|
| 0 | Pulito, nessun errore trovato |
| 1 | Almeno un riscontro di livello errore (o avviso con --strict) |
| 2 | File di configurazione non trovato |
Ogni riscontro ha un codice stabile che puoi cercare con grep o usare negli script.
I riscontri includono un suggerimento quando possibile, ad esempio «sposta Host * alla fine del file».
Host github.com gitlab.com)Include conf.d/*.conf extra.conf)IdentityFile ~/.ssh/id # my key)ProxyCommand "ssh -W %h:%p bastion")cargo test # run all tests
cargo test --lib # unit tests only
cargo clippy # lint
cargo fmt --check # formatting
src/
main.rs CLI
lib.rs Public API (lint_file, lint_str)
model.rs AST types
lexer.rs Tokenizer
parser.rs Builds config AST from tokens
resolve.rs Include expansion + cycle detection
report.rs Text and JSON formatters
rules/
mod.rs Rule trait and runner
basic.rs Built-in rules
tests/
fixtures/ Sample config files
cli.rs CLI integration tests
integration.rs Fixture-based tests
Rule in src/rules/basic.rsrun_all() in src/rules/mod.rsVedi CONTRIBUTING.md per maggiori dettagli.
MIT
| Codice | Regola | Severità | Descrizione |
|---|
DUP_HOST | duplicate-host | avviso | Due blocchi Host con lo stesso pattern |
MISSING_IDENTITY | identity-file-exists | errore | Il percorso di IdentityFile non esiste |
WILDCARD_ORDER | wildcard-host-order | avviso | Host * appare prima di pattern specifici |
WEAK_ALGO | deprecated-weak-algorithms | avviso | Algoritmo debole o deprecato (3des-cbc, arcfour, hmac-md5, ssh-dss, ecc.) |
DUP_DIRECTIVE | duplicate-directives | avviso | La stessa direttiva ripetuta in un unico scope (solo il primo valore ha effetto) |
INSECURE_OPT | insecure-option | avviso | Impostazione pericolosa come StrictHostKeyChecking no o ForwardAgent yes su Host * |
UNSAFE_CTRL_PATH | unsafe-control-path | avviso | ControlPath senza %h, %p, %r (o %C) — le connessioni possono condividere una socket |
INCLUDE_CYCLE | include-cycle | errore | Catena Include circolare |
INCLUDE_READ | include-read | errore | Impossibile leggere il file incluso |
INCLUDE_GLOB | include-glob | errore | Pattern glob Include non valido |
INCLUDE_NO_MATCH | include-no-match | info | Nessun file corrisponde al pattern Include |