العودة إلى التحديثات
New releaseSep 3, 2026

sshconfig-lint v0.5.0

مدقق قائم على القواعد لملفات تكوين عميل OpenSSH يكتشف الـhosts المكررة، ملفات الهوية المفقودة، الخوارزميات الضعيفة، مشاكل ترتيب wildcard، والإعدادات الخطرة مع إخراج 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

الإجراء الرسمي متاح في 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

تظهر النتائج كتعليقات توضيحية على الملف والسطر المحددين. يقوم الإجراء بتنزيل الإصدار المطابق لوسمه ويتحقق من 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 ومسارات نظام الملفات. تُرفق النتائج من 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. رموز القواعد ورموز الخروج هي واجهات أتمتة مستقرة.

الخروجالمعنى
0لا توجد نتيجة بمستوى خطأ، ولا تحذيرات مع --strict
1نتيجة حاجبة واحدة على الأقل
2تعذّر قراءة إعداد واحد مطلوب على الأقل

القواعد

الرمزالقاعدةالخطورة
INVALID_VALUEقيمة توجيه غير صالحةerror
DUP_HOSTكتلة Host مكررةwarning
MISSING_IDENTITYIdentityFile غير موجودerror
WILDCARD_ORDERترتيب أحرف البدل في Hostwarning
WEAK_ALGOخوارزمية ضعيفةwarning
DUP_DIRECTIVEتوجيه مكررwarning
INSECURE_OPTخيار غير آمنwarning
UNSAFE_CTRL_PATHControlPath غير آمنwarning
INCLUDE_CYCLEدورة Includeerror
INCLUDE_DEPTHتداخل Include عميق جدًاerror
INCLUDE_READتعذّر قراءة Includeerror
INCLUDE_GLOBنمط Include غير صالحerror
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شرط Match غير صالحerror
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 محتمل أن يجعل الأمر فعّالًا. حلّل Includes من خلال CLI العادي أو مستند محرر محفوظ للحصول على أدق نتيجة.

التطوير

يتطلب Rust 1.85 أو أحدث.

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

راجع CONTRIBUTING.md، وخارطة الطريق العامة، و عقد استقرار v1، وسياسة الأمان.

الترخيص

MIT

الفئات