
sshconfig-lint v0.5.0
Линтер на основе правил для конфигурационных файлов клиента OpenSSH, который обнаруживает дублирующиеся хосты, отсутствующие файлы identity, слабые алгоритмы, проблемы с порядком подстановочных знаков и опасные настройки, с выводом в формате JSON и кодами возврата, удобными для CI.
sshconfig-lint
Один движок для всех мест, где меняется ваш SSH-конфиг.
sshconfig-lint находит семантические ошибки в клиентских конфигах OpenSSH: дублирующиеся хосты, неработающие пути к ключам, небезопасные опции, слабые алгоритмы, порядок wildcard-шаблонов и запутанные цепочки Include. Используйте одни и те же коды правил локально, в Git-хуках, GitHub Actions и редакторах.
Попробуйте приватную браузерную песочницу · Изучайте на интерактивных примерах · Прочитайте все правила
Браузерная проверка выполняется на вашем устройстве. Содержимое конфигов не загружается, телеметрия не собирается.
Быстрый старт
# 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
Установка
Homebrew
brew tap Noah4ever/tap
brew install sshconfig-lint
Cargo
cargo install sshconfig-lint
Arch Linux
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, чтобы переопределить значения по умолчанию.
GitHub Actions
Официальный Action доступен в 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
Находки отображаются как аннотации на конкретном файле и строке. 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
Pre-Commit
repos:
- repo: https://github.com/Noah4ever/sshconfig-lint
rev: v1.0.0
hooks:
- id: sshconfig-lint-strict
Используйте id: sshconfig-lint, если предупреждения не должны блокировать коммит. Переопределите files: в вашем проекте, если конфиги используют другое соглашение об именовании.
Редакторы
VS Code
Установите расширение VS Code из Marketplace или выполните:
code --install-extension NoahThiering.sshconfig-lint
Расширение запускает sshconfig-lint lsp, один раз скачивает соответствующий проверенный бинарный файл, а затем работает офлайн. Оно распознаёт .ssh/config, ssh_config и dot_ssh/config от chezmoi. Телеметрия не собирается. Исходный код доступен в editors/vscode.
Neovim
Протестированный пример editors/neovim использует встроенный
LSP-клиент Neovim. Скопируйте его небольшой Lua-модуль в свою конфигурацию и запустите его с помощью:
require("sshconfig_lint").setup()
Он использует тот же сервер sshconfig-lint lsp, что и VS Code, и поддерживает пользовательский
путь к бинарному файлу.
Любой редактор с поддержкой LSP может запустить:
sshconfig-lint lsp
Языковой сервер v0.5 публикует диагностику по всей строке при открытии, изменении и сохранении. Несохранённые буферы выполняют только правила, основанные на содержимом; сохранённые файлы дополнительно разрешают Include и пути файловой системы. Находки из вложенных 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. Коды правил и коды выхода — это стабильные интерфейсы автоматизации.
| Выход | Значение |
|---|---|
0 | Нет находок уровня ошибки и нет предупреждений при --strict |
1 | Как минимум одна блокирующая находка |
2 | Как минимум один запрошенный конфиг не удалось прочитать |
Правила
Руководства по правилам показывают точный сломанный фрагмент, исправленный конфиг, почему это важно и как проверить результат с помощью OpenSSH.
INVALID_VALUE проверяет порты, счётчики повторов и запросов, настройки alive, ForwardX11Timeout, RequiredRSASize, ControlPersist, булевы переключатели, ObscureKeystrokeTiming, значения времени OpenSSH, StreamLocalBindMask, IPQoS и документированные наборы значений, такие как AddressFamily, ControlMaster, StrictHostKeyChecking, LogLevel и PubkeyAuthentication. Заключённые в кавычки значения и значения без учёта регистра, принимаемые OpenSSH, остаются допустимыми. Линтер принимает современный синтаксис, не пытаясь определить версию SSH-клиента, который будет использовать конфиг.
Проверки файловой системы пропускают пути, содержащие процентные токены или переменные окружения, поскольку их итоговое значение зависит от контекста подключения. LOCAL_COMMAND_DISABLED столь же консервативен: он подавляется, когда неразрешённый Include или любой возможный PermitLocalCommand yes может сделать команду действующей. Разрешайте Include через обычный CLI или сохранённый документ редактора для наиболее точного результата.
Разработка
Требуется Rust 1.85 или новее.
cargo test --all
cargo clippy --all-targets --all-features -- -D warnings
cargo fmt -- --check
См. CONTRIBUTING.md, публичный roadmap, контракт стабильности v1 и политику безопасности.
Лицензия
MIT