返回更新列表
新发布Sep 3, 2026

sshconfig-lint v0.5.0

基于规则的OpenSSH客户端配置文件检查工具,可检测重复主机、缺失的身份文件、弱算法、通配符排序问题及危险设置,支持JSON输出和CI友好的退出代码。

分享

sshconfig-lint

Tests crates.io License: MIT

一个引擎,适用于 SSH 配置发生变更的所有场景。

sshconfig-lint 可发现 OpenSSH 客户端配置中的语义错误:重复主机、损坏的身份文件路径、不安全选项、弱算法、通配符顺序以及错综复杂的 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

从 Marketplace 安装 VS Code 扩展,或运行:

code --install-extension NoahThiering.sshconfig-lint

该扩展会启动 sshconfig-lint lsp,一次性下载匹配的已验证二进制文件,之后即可离线工作。它可识别 .ssh/config、ssh_config 以及 chezmoi 的 dot_ssh/config。不会收集任何遥测数据。其源代码位于 editors/vscode。

Neovim

经过测试的 editors/neovim 示例使用 Neovim 内置的 LSP 客户端。将其小型 Lua 模块复制到您的配置中,并通过以下方式启动:

require("sshconfig_lint").setup()

它使用与 VS Code 相同的 sshconfig-lint lsp 服务器,并支持自定义 二进制文件路径。

任何支持 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重复的 Host 块warning
MISSING_IDENTITY未找到 IdentityFileerror
WILDCARD_ORDERHost 通配符顺序warning
WEAK_ALGO弱算法warning
DUP_DIRECTIVE重复指令warning
INSECURE_OPT不安全选项warning
UNSAFE_CTRL_PATH不安全的 ControlPathwarning
INCLUDE_CYCLEInclude 循环error
INCLUDE_DEPTHInclude 嵌套过深error
INCLUDE_READInclude 无法读取error
INCLUDE_GLOB无效的 Include 模式error
INCLUDE_NO_MATCHInclude 未匹配任何文件info
NEGATED_HOSTHost 仅包含否定模式warning
PROXY_CONFLICTProxyCommand 与 ProxyJump 冲突warning
REVOKED_HOST_KEYS_UNREADABLERevokedHostKeys 文件不可读error
MISSING_CERTIFICATE未找到 CertificateFileerror
LOCAL_COMMAND_DISABLEDLocalCommand 未启用warning
INVALID_TOKEN无效的百分号标记error
INVALID_SYNTAX无效语法error
UNKNOWN_DIRECTIVE未知指令error
DEPRECATED_OPTION已弃用选项warning
INVALID_MATCH无效的 Match 条件error
CONTROL_PERSIST_UNUSEDControlPersist 缺少 ControlMasterwarning
UPDATE_HOSTKEYS_ASK_PERSISTUpdateHostKeys ask 与 ControlPersist 同时使用warning

规则指南会展示确切的错误片段、修正后的配置、其重要性,以及如何使用 OpenSSH 验证结果。

INVALID_VALUE 会检查端口、重试和提示计数器、alive 设置、ForwardX11Timeout、RequiredRSASize、ControlPersist、布尔开关、ObscureKeystrokeTiming、OpenSSH 时间值、StreamLocalBindMask、IPQoS,以及有文档记录的值集合,例如 AddressFamily、ControlMaster、StrictHostKeyChecking、LogLevel 和 PubkeyAuthentication。OpenSSH 接受的带引号和不区分大小写的值仍然有效。该 linter 接受现代语法,不会尝试推断将使用该配置的 SSH 客户端版本。

文件系统检查会跳过包含百分号标记或环境变量的路径,因为它们的最终值取决于连接上下文。LOCAL_COMMAND_DISABLED 同样保守:当未解析的 Include 或任何可能的 PermitLocalCommand yes 可能使该命令生效时,它会被抑制。通过常规 CLI 或已保存的编辑器文档解析 Include,以获得最精确的结果。

开发

需要 Rust 1.85 或更高版本。

cargo test --all
cargo clippy --all-targets --all-features -- -D warnings
cargo fmt -- --check

请参阅 CONTRIBUTING.md、公开的路线图、 v1 稳定性契约 和安全策略。

许可证

MIT

分类