
OpenSSH 클라이언트 구성 파일을 위한 규칙 기반 린터로, 중복 호스트, 누락된 ID 파일, 취약한 알고리즘, 와일드카드 정렬 문제, 위험한 설정을 감지하며 JSON 출력 및 CI 친화적인 종료 코드를 제공합니다.
SSH 설정이 바뀌는 모든 곳을 위한 단일 엔진.
sshconfig-lint는 OpenSSH 클라이언트 설정에서 의미상의 실수를 찾아냅니다: 중복 호스트, 깨진 identity 경로, 안전하지 않은 옵션, 취약한 알고리즘, 와일드카드 순서, 그리고 얽힌 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
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을 설정하세요.
공식 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
repos:
- repo: https://github.com/Noah4ever/sshconfig-lint
rev: v1.0.0
hooks:
- id: sshconfig-lint-strict
경고가 커밋을 막지 않아야 할 때는 id: sshconfig-lint를 사용하세요. 설정 파일이 다른 명명 규칙을 사용하는 경우 프로젝트에서 files:를 재정의하세요.
Marketplace에서 VS Code 확장을 설치하거나 다음을 실행하세요:
code --install-extension NoahThiering.sshconfig-lint
이 확장은 sshconfig-lint lsp를 시작하고, 일치하는 검증된 바이너리를 한 번 다운로드한 후 오프라인으로 작동합니다. .ssh/config, ssh_config, 그리고 chezmoi의 dot_ssh/config를 인식합니다. 어떠한 텔레메트리도 수집되지 않습니다. 소스는 editors/vscode에서 확인할 수 있습니다.
테스트된 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 | IdentityFile을 찾을 수 없음 | error |
WILDCARD_ORDER | Host 와일드카드 순서 | warning |
WEAK_ALGO | 취약한 알고리즘 | warning |
DUP_DIRECTIVE | 중복 지시문 | warning |
INSECURE_OPT | 안전하지 않은 옵션 | warning |
UNSAFE_CTRL_PATH | 안전하지 않은 ControlPath | warning |
INCLUDE_CYCLE | Include 순환 | error |
INCLUDE_DEPTH | Include 중첩이 너무 깊음 | error |
INCLUDE_READ | Include를 읽을 수 없음 | error |
INCLUDE_GLOB | 잘못된 Include 패턴 | error |
INCLUDE_NO_MATCH | Include가 일치하는 파일 없음 | info |
NEGATED_HOST | Host에 부정 패턴만 있음 | warning |
PROXY_CONFLICT | ProxyCommand와 ProxyJump 충돌 | warning |
REVOKED_HOST_KEYS_UNREADABLE | RevokedHostKeys 파일을 읽을 수 없음 | error |
MISSING_CERTIFICATE | CertificateFile을 찾을 수 없음 | error |
LOCAL_COMMAND_DISABLED | LocalCommand가 활성화되지 않음 | warning |
INVALID_TOKEN | 잘못된 퍼센트 토큰 | error |
INVALID_SYNTAX | 잘못된 구문 | error |
UNKNOWN_DIRECTIVE | 알 수 없는 지시문 | error |
DEPRECATED_OPTION | 더 이상 사용되지 않는 옵션 | warning |
INVALID_MATCH | 잘못된 Match 조건 | error |
CONTROL_PERSIST_UNUSED | ControlMaster 없는 ControlPersist | warning |
UPDATE_HOSTKEYS_ASK_PERSIST | ControlPersist와 함께 사용된 UpdateHostKeys ask | warning |
규칙 가이드는 정확히 깨진 부분, 수정된 설정, 왜 중요한지, 그리고 OpenSSH로 결과를 검증하는 방법을 보여줍니다.
INVALID_VALUE는 포트, 재시도 및 프롬프트 카운터, alive 설정, ForwardX11Timeout, RequiredRSASize, ControlPersist, 불리언 스위치, ObscureKeystrokeTiming, OpenSSH 시간 값, StreamLocalBindMask, IPQoS, 그리고 AddressFamily, ControlMaster, StrictHostKeyChecking, LogLevel, PubkeyAuthentication과 같은 문서화된 값 집합을 검사합니다. OpenSSH가 허용하는 따옴표로 묶인 값과 대소문자를 구분하지 않는 값은 유효하게 유지됩니다. 린터는 설정을 소비할 SSH 클라이언트의 버전을 추론하려 하지 않고 최신 구문을 허용합니다.
파일 시스템 검사는 퍼센트 토큰이나 환경 변수를 포함하는 경로를 건너뜁니다. 그 최종 값이 연결 컨텍스트에 따라 달라지기 때문입니다. LOCAL_COMMAND_DISABLED도 마찬가지로 보수적입니다: 해석되지 않은 Include나 가능한 PermitLocalCommand yes가 명령을 유효하게 만들 수 있을 때는 억제됩니다. 가장 정확한 결과를 얻으려면 일반 CLI나 저장된 에디터 문서를 통해 Include를 해석하세요.
Rust 1.85 이상이 필요합니다.