Назад к обновлениям
New releaseSep 3, 2026

sshconfig-lint v0.5.0

Линтер на основе правил для конфигурационных файлов клиента OpenSSH, который обнаруживает дублирующиеся хосты, отсутствующие файлы identity, слабые алгоритмы, проблемы с порядком подстановочных знаков и опасные настройки, с выводом в формате JSON и кодами возврата, удобными для CI.

Поделиться

sshconfig-lint

Tests crates.io License: MIT

Один движок для всех мест, где меняется ваш 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Как минимум один запрошенный конфиг не удалось прочитать

Правила

КодПравилоСерьёзность
INVALID_VALUEНедопустимое значение директивыerror
DUP_HOSTДублирующийся блок Hostwarning
MISSING_IDENTITYIdentityFile не найденerror
WILDCARD_ORDERПорядок wildcard-шаблонов Hostwarning
WEAK_ALGOСлабый алгоритмwarning
DUP_DIRECTIVEДублирующаяся директиваwarning
INSECURE_OPTНебезопасная опцияwarning
UNSAFE_CTRL_PATHНебезопасный ControlPathwarning
INCLUDE_CYCLEЦикл Includeerror
INCLUDE_DEPTHСлишком глубокая вложенность Includeerror
INCLUDE_READInclude невозможно прочитатьerror
INCLUDE_GLOBНедопустимый шаблон Includeerror
INCLUDE_NO_MATCHInclude не соответствует ни одному файлуinfo
NEGATED_HOSTHost содержит только отрицающие шаблоныwarning
PROXY_CONFLICTКонфликт ProxyCommand и ProxyJumpwarning
REVOKED_HOST_KEYS_UNREADABLEФайл RevokedHostKeys недоступен для чтенияerror
MISSING_CERTIFICATECertificateFile не найденerror
LOCAL_COMMAND_DISABLEDLocalCommand не включёнwarning
INVALID_TOKENНедопустимый процентный токенerror
INVALID_SYNTAXНедопустимый синтаксисerror
UNKNOWN_DIRECTIVEНеизвестная директиваerror
DEPRECATED_OPTIONУстаревшая опцияwarning
INVALID_MATCHНедопустимое условие Matcherror
CONTROL_PERSIST_UNUSEDControlPersist без ControlMasterwarning
UPDATE_HOSTKEYS_ASK_PERSISTUpdateHostKeys ask с ControlPersistwarning

Руководства по правилам показывают точный сломанный фрагмент, исправленный конфиг, почему это важно и как проверить результат с помощью 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

Категории