अपडेट पर वापस जाएँ
New releaseSep 3, 2026

sshconfig-lint v0.5.0

Rule-based linter for OpenSSH client config files जो डुप्लिकेट होस्ट, गुम पहचान फ़ाइलें, कमजोर एल्गोरिदम, वाइल्डकार्ड ऑर्डरिंग समस्याएं, और खतरनाक सेटिंग्स का पता लगाता है, JSON आउटपुट और CI-अनुकूल एग्जिट कोड के साथ।

साझा करें

sshconfig-lint

Tests crates.io License: MIT

हर उस जगह के लिए एक इंजन जहाँ आपका SSH कॉन्फ़िग बदलता है।

sshconfig-lint OpenSSH क्लाइंट कॉन्फ़िग्स में सिमेंटिक गलतियाँ ढूँढता है: डुप्लिकेट होस्ट, टूटे हुए identity पाथ, असुरक्षित ऑप्शन, कमज़ोर एल्गोरिदम, वाइल्डकार्ड ऑर्डरिंग, और उलझी हुई Include चेन। एक ही रूल कोड को लोकली, Git hooks, 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 और फ़ाइलसिस्टम पाथ को हल करती हैं। नेस्टेड Includes से मिले निष्कर्ष शामिल की गई फ़ाइल से जोड़े जाते हैं और रूट दस्तावेज़ के साथ साफ़ हो जाते हैं।

आउटपुट फ़ॉर्मैट

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 शामिल होते हैं। रूल कोड और एग्ज़िट कोड स्थिर ऑटोमेशन इंटरफ़ेस हैं।

ExitMeaning
0कोई error-स्तरीय निष्कर्ष नहीं, और --strict के साथ कोई चेतावनी नहीं
1कम से कम एक ब्लॉकिंग निष्कर्ष
2कम से कम एक अनुरोधित कॉन्फ़िग पढ़ा नहीं जा सका

नियम

CodeRuleSeverity
INVALID_VALUEअमान्य डायरेक्टिव मानerror
DUP_HOSTडुप्लिकेट Host ब्लॉकwarning
MISSING_IDENTITYIdentityFile नहीं मिलाerror
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_CERTIFICATECertificateFile नहीं मिलाerror
LOCAL_COMMAND_DISABLEDLocalCommand सक्षम नहीं हैwarning
INVALID_TOKENअमान्य प्रतिशत टोकनerror
INVALID_SYNTAXअमान्य सिंटैक्सerror
UNKNOWN_DIRECTIVEअज्ञात डायरेक्टिवerror
DEPRECATED_OPTIONअप्रचलित ऑप्शनwarning
INVALID_MATCHअमान्य Match शर्तerror
CONTROL_PERSIST_UNUSEDControlMaster के बिना ControlPersistwarning
UPDATE_HOSTKEYS_ASK_PERSISTControlPersist के साथ UpdateHostKeys askwarning

रूल गाइड सटीक टूटा हुआ अंश, एक सुधारा हुआ कॉन्फ़िग, यह क्यों मायने रखता है, और 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 या सहेजे गए एडिटर दस्तावेज़ के माध्यम से Includes को हल करें।

विकास

Rust 1.85 या नए की आवश्यकता है।

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

CONTRIBUTING.md, सार्वजनिक रोडमैप, v1 स्थिरता अनुबंध, और सुरक्षा नीति देखें।

लाइसेंस

MIT

श्रेणियाँ