
sshconfig-lint v0.5.0
Regelbasierter Linter für OpenSSH-Client-Konfigurationsdateien, der doppelte Hosts, fehlende Identitätsdateien, schwache Algorithmen, Probleme mit der Wildcard-Reihenfolge und gefährliche Einstellungen erkennt und eine JSON-Ausgabe sowie CI-freundliche Exit-Codes bietet.
sshconfig-lint
Eine Engine für jeden Ort, an dem sich deine SSH-Konfiguration ändert.
sshconfig-lint findet semantische Fehler in OpenSSH-Client-Konfigurationen: doppelte Hosts, fehlerhafte Identitätspfade, unsichere Optionen, schwache Algorithmen, Wildcard-Reihenfolge und verworrene Include-Ketten. Verwende dieselben Regelcodes lokal, in Git-Hooks, GitHub Actions und Editoren.
Probiere den privaten Browser-Playground aus · Lerne mit interaktiven Beispielen · Lies jede Regel
Der Browser-Checker läuft auf deinem Gerät. Konfigurationsinhalte werden nicht hochgeladen und es werden keine Telemetriedaten erfasst.
Schnellstart
# 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
Die Release-Seite bietet verifizierte Binärdateien für Linux, macOS und Windows. Der Komfort-Installer überprüft die Release-Prüfsumme vor der Installation:
curl -fsSL https://raw.githubusercontent.com/Noah4ever/sshconfig-lint/main/install.sh | bash
Setze VERSION=v0.5.0 oder INSTALL_DIR=~/.local/bin, um die Standardwerte zu überschreiben.
GitHub Actions
Die offizielle Action ist im GitHub Marketplace verfügbar.
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
Befunde erscheinen als Annotationen an der exakten Datei und Zeile. Die Action lädt das zu ihrem Tag passende Release herunter und überprüft SHA256SUMS vor der Ausführung.
Für Repositories mit aktiviertem GitHub Code Scanning kann SARIF separat hochgeladen werden:
- 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
Verwende id: sshconfig-lint, wenn Warnungen einen Commit nicht blockieren sollen. Überschreibe files: in deinem Projekt, wenn Konfigurationen einer anderen Namenskonvention folgen.
Editoren
VS Code
Installiere die VS Code-Erweiterung aus dem Marketplace oder führe aus:
code --install-extension NoahThiering.sshconfig-lint
Die Erweiterung startet sshconfig-lint lsp, lädt einmalig eine passende verifizierte Binärdatei herunter und funktioniert danach offline. Sie erkennt .ssh/config, ssh_config und chezmois dot_ssh/config. Es werden keine Telemetriedaten erfasst. Der Quellcode ist in editors/vscode verfügbar.
Neovim
Das getestete Beispiel editors/neovim verwendet den integrierten
LSP-Client von Neovim. Kopiere sein kleines Lua-Modul in deine Konfiguration und starte es mit:
require("sshconfig_lint").setup()
Es verwendet denselben sshconfig-lint lsp-Server wie VS Code und unterstützt einen benutzerdefinierten
Binärpfad.
Jeder Editor mit LSP-Unterstützung kann starten:
sshconfig-lint lsp
Der v0.5-Sprachserver veröffentlicht Diagnosen über die gesamte Zeile beim Öffnen, Ändern und Speichern. Unbenannte Puffer führen nur inhaltsbezogene Regeln aus; gespeicherte Dateien lösen zusätzlich Include und Dateisystempfade auf. Befunde aus verschachtelten Includes werden an die eingebundene Datei angehängt und mit dem Wurzeldokument gelöscht.
Ausgabeformate
sshconfig-lint --format text
sshconfig-lint --format json
sshconfig-lint --format github
sshconfig-lint --format sarif
JSON-Befunde enthalten severity, code, rule, line, file, message, hint und documentation. Regelcodes und Exit-Codes sind stabile Automatisierungsschnittstellen.
| Exit | Bedeutung |
|---|---|
0 | Kein Befund auf Fehlerstufe und keine Warnungen mit --strict |
1 | Mindestens ein blockierender Befund |
2 | Mindestens eine angeforderte Konfiguration konnte nicht gelesen werden |
Regeln
Die Regelanleitungen zeigen das exakte fehlerhafte Fragment, eine korrigierte Konfiguration, warum es wichtig ist und wie das Ergebnis mit OpenSSH überprüft werden kann.
INVALID_VALUE prüft Ports, Wiederholungs- und Prompt-Zähler, Alive-Einstellungen, ForwardX11Timeout, RequiredRSASize, ControlPersist, boolesche Schalter, ObscureKeystrokeTiming, OpenSSH-Zeitwerte, StreamLocalBindMask, IPQoS und dokumentierte Wertemengen wie AddressFamily, ControlMaster, StrictHostKeyChecking, LogLevel und PubkeyAuthentication. Von OpenSSH akzeptierte quotierte und groß-/kleinschreibungsunabhängige Werte bleiben gültig. Der Linter akzeptiert moderne Syntax, ohne zu versuchen, die Version des SSH-Clients abzuleiten, der die Konfiguration verwenden wird.
Dateisystemprüfungen überspringen Pfade, die Prozent-Token oder Umgebungsvariablen enthalten, da ihr endgültiger Wert vom Verbindungskontext abhängt. LOCAL_COMMAND_DISABLED ist ebenfalls konservativ: Es wird unterdrückt, wenn ein unaufgelöstes Include oder ein mögliches PermitLocalCommand yes den Befehl wirksam machen könnte. Löse Includes über die normale CLI oder ein gespeichertes Editor-Dokument auf, um das präziseste Ergebnis zu erhalten.
Entwicklung
Erfordert Rust 1.85 oder neuer.
cargo test --all
cargo clippy --all-targets --all-features -- -D warnings
cargo fmt -- --check
Siehe CONTRIBUTING.md, die öffentliche Roadmap, den v1-Stabilitätsvertrag und die Sicherheitsrichtlinie.
Lizenz
MIT