Zurück zu den Updates
New releaseSep 3, 2026

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.

Teilen

sshconfig-lint

Tests crates.io License: MIT

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.

ExitBedeutung
0Kein Befund auf Fehlerstufe und keine Warnungen mit --strict
1Mindestens ein blockierender Befund
2Mindestens eine angeforderte Konfiguration konnte nicht gelesen werden

Regeln

CodeRegelSchweregrad
INVALID_VALUEUngültiger Direktivenwerterror
DUP_HOSTDoppelter Host-Blockwarning
MISSING_IDENTITYIdentityFile nicht gefundenerror
WILDCARD_ORDERReihenfolge der Host-Wildcardswarning
WEAK_ALGOSchwacher Algorithmuswarning
DUP_DIRECTIVEDoppelte Direktivewarning
INSECURE_OPTUnsichere Optionwarning
UNSAFE_CTRL_PATHUnsichere ControlPathwarning
INCLUDE_CYCLEInclude-Zykluserror
INCLUDE_DEPTHInclude-Verschachtelung zu tieferror
INCLUDE_READInclude kann nicht gelesen werdenerror
INCLUDE_GLOBUngültiges Include-Mustererror
INCLUDE_NO_MATCHInclude entspricht keiner Dateiinfo
NEGATED_HOSTHost hat nur negierte Musterwarning
PROXY_CONFLICTKonflikt zwischen ProxyCommand und ProxyJumpwarning
REVOKED_HOST_KEYS_UNREADABLERevokedHostKeys-Datei ist nicht lesbarerror
MISSING_CERTIFICATECertificateFile nicht gefundenerror
LOCAL_COMMAND_DISABLEDLocalCommand ist nicht aktiviertwarning
INVALID_TOKENUngültiges Prozent-Tokenerror
INVALID_SYNTAXUngültige Syntaxerror
UNKNOWN_DIRECTIVEUnbekannte Direktiveerror
DEPRECATED_OPTIONVeraltete Optionwarning
INVALID_MATCHUngültige Match-Bedingungerror
CONTROL_PERSIST_UNUSEDControlPersist ohne ControlMasterwarning
UPDATE_HOSTKEYS_ASK_PERSISTUpdateHostKeys ask mit ControlPersistwarning

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

Kategorien