
Линтер на основе правил для конфигурационных файлов клиента OpenSSH, который обнаруживает дублирующиеся хосты, отсутствующие файлы identity, слабые алгоритмы, проблемы с порядком подстановочных знаков и опасные настройки, с выводом в формате JSON и кодами возврата, удобными для CI.
Один движок для всех мест, где меняется ваш SSH-конфиг.
sshconfig-lint находит семантические ошибки в клиентских конфигах OpenSSH: дублирующиеся хосты, нерабочие пути к identity-файлам, небезопасные опции, слабые алгоритмы, порядок wildcard-шаблонов и запутанные цепочки Include. Используйте одни и те же коды правил локально, в Git-хуках, GitHub Actions и редакторах.
Попробуйте приватную браузерную песочницу · Учитесь на интерактивных примерах · Прочитайте о каждом правиле
Браузерная проверка выполняется на вашем устройстве. Содержимое конфигов не загружается, телеметрия не собирается.
# проверить ~/.ssh/config
sshconfig-lint
# проверить один или несколько конфигов в репозитории
sshconfig-lint .ssh/config infrastructure/ssh_config
# завершаться с ошибкой при предупреждениях и ошибках
sshconfig-lint .ssh/config --strict
brew tap Noah4ever/tap
brew install sshconfig-lint
cargo install sshconfig-lint
yay -S sshconfig-lint-bin
На странице релизов доступны проверенные бинарные файлы для Linux, macOS и Windows. Удобный установщик проверяет контрольную сумму релиза перед установкой:
curl -fsSL https://raw.githubusercontent.com/Noah4ever/sshconfig-lint/main/install.sh | bash
Задайте VERSION=v0.5.0 или INSTALL_DIR=~/.local/bin, чтобы переопределить значения по умолчанию.
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
Находки отображаются в виде аннотаций на точном файле и строке. Action загружает релиз, соответствующий его тегу, и проверяет SHA256SUMS перед выполнением.
Для репозиториев с включённым GitHub Code Scanning SARIF можно загружать отдельно:
- run: sshconfig-lint .ssh/config --format sarif > sshconfig-lint.sarif
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: sshconfig-lint.sarif
repos:
- repo: https://github.com/Noah4ever/sshconfig-lint
rev: v0.5.0
hooks:
- id: sshconfig-lint-strict
Используйте id: sshconfig-lint, когда предупреждения не должны блокировать коммит. Переопределите files: в вашем проекте, если конфиги используют другое соглашение об именовании.
Установите расширение для VS Code из Marketplace или выполните:
code --install-extension NoahThiering.sshconfig-lint
Расширение запускает sshconfig-lint lsp, один раз загружает подходящий проверенный бинарный файл и затем работает офлайн. Оно распознаёт .ssh/config, ssh_config и dot_ssh/config от chezmoi. Телеметрия не собирается. Его исходный код доступен в editors/vscode.
Любой редактор с поддержкой LSP может запустить:
sshconfig-lint lsp
Языковой сервер v0.5 публикует диагностику на всю строку при открытии, изменении и сохранении. Буферы без имени выполняют только правила, работающие с содержимым; для сохранённых файлов дополнительно разрешаются Include и пути файловой системы.
sshconfig-lint --format text
sshconfig-lint --format json
sshconfig-lint --format github
sshconfig-lint --format sarif
JSON-находки содержат severity, code, rule, line, file, message, hint и documentation. Коды правил и коды выхода — стабильные интерфейсы автоматизации.
| Exit | Значение |
|---|---|
0 | Нет находок уровня ошибки и нет предупреждений с --strict |
1 | Как минимум одна блокирующая находка |
2 | Как минимум один запрошенный конфиг не удалось прочитать |
| Код | Правило | Серьёзность |
|---|---|---|
DUP_HOST | Дублирующийся блок Host | предупреждение |
MISSING_IDENTITY | IdentityFile не найден | ошибка |
WILDCARD_ORDER | Порядок wildcard-шаблонов Host | предупреждение |
WEAK_ALGO | Слабый алгоритм | предупреждение |
DUP_DIRECTIVE | Дублирующаяся директива | предупреждение |
INSECURE_OPT | Небезопасная опция | предупреждение |
UNSAFE_CTRL_PATH | Небезопасный ControlPath | предупреждение |
INCLUDE_CYCLE | Цикл Include | ошибка |
INCLUDE_READ | Include невозможно прочитать | ошибка |
INCLUDE_GLOB | Недопустимый шаблон Include | ошибка |
INCLUDE_NO_MATCH | Include не соответствует ни одному файлу | информация |
Руководства по правилам показывают точный повреждённый фрагмент, исправленный конфиг, почему это важно и как проверить результат с помощью OpenSSH.
Требуется Rust 1.85 или новее.
cargo test --all
cargo clippy --all-targets --all-features -- -D warnings
cargo fmt -- --check
См. CONTRIBUTING.md, публичную дорожную карту и политику безопасности.
MIT