العودة إلى التحديثات
New releaseJul 29, 2026

swift-nio-ssh v0.15.0

SwiftNIO SSH هو تنفيذ برمجي لـ SSH باستخدام SwiftNIO

مشاركة

SwiftNIO SSH

يحتوي هذا المشروع على دعم SSH باستخدام SwiftNIO.

ما هو SwiftNIO SSH؟

SwiftNIO SSH هو تطبيق برمجي لـ SSH: أي أنه مجموعة من واجهات برمجة التطبيقات (APIs) التي تسمح للمبرمجين بتنفيذ نقاط نهاية تتحدث بروتوكول SSH. والأهم من ذلك، أن هذا يعني أنه يشبه libssh2 أكثر من openssh. لا يوفر SwiftNIO SSH عملاء وخوادم SSH جاهزة للإنتاج، ولكنه يوفر اللبنات الأساسية لبناء هذا النوع من العملاء والخوادم.

هناك عدة أسباب لتوفير تطبيق برمجي لـ SSH. أحدها هو أن SSH له علاقة فريدة بالتفاعل مع المستخدم. المستخدمون التقنيون معتادون بشدة على التفاعل مع SSH بشكل تفاعلي، إما لتشغيل الأوامر على أجهزة بعيدة أو لتشغيل واجهات شل تفاعلية. إن القدرة على الاستجابة برمجيًا لهذه الطلبات تتيح أنماطًا بديلة مثيرة للاهتمام من التفاعل. كأمثلة سابقة، يمكننا الإشارة إلى Twisted's Manhole، والذي يستخدم تطبيق SSH برمجي يسمى conch لتوفير مترجم بايثون تفاعلي داخل خادم بايثون قيد التشغيل، أو ssh-chat، وهو خادم SSH يوفر غرفة دردشة بدلاً من وظيفة شل SSH العادية. يمكن أيضًا تخيل استخدامات مبتكرة لإعادة توجيه TCP.

سبب جيد آخر لتوفير SSH برمجي هو أنه ليس من غير المألوف أن تحتاج الخدمات إلى التفاعل مع خدمات أخرى بطريقة تتضمن تشغيل الأوامر. بينما يحل Process هذه المشكلة للحالة المحلية، إلا أن الأوامر التي يجب استدعاؤها قد تكون بعيدة. على الرغم من أن Process يمكنه تشغيل عميل ssh كعملية فرعية لتنفيذ هذا الاستدعاء، إلا أنه يمكن أن يكون أبسط بكثير مجرد استدعاء SSH مباشرة. هذا هو حالة الاستخدام المستهدفة لـ libssh2. يوفر SwiftNIO SSH ما يعادل طبقة الشبكات والتشفير في libssh2، مما يسمح للمستخدمين المتحمسين بقيادة جلسات SSH مباشرة من داخل خدمات Swift.

تدعم أحدث إصدارات SwiftNIO SSH إصدار Swift 5.9 والإصدارات الأحدث. الحد الأدنى من إصدار Swift الذي تدعمه إصدارات SwiftNIO SSH موضح أدناه:

SwiftNIO SSHالحد الأدنى من إصدار Swift
0.0.0 ..< 0.3.05.1
0.3.0 ..< 0.4.05.2
0.4.0 ..< 0.5.05.4
0.5.0 ..< 0.6.25.5.2
0.6.2 ..< 0.9.05.6
0.9.0 ..< 0.9.25.8
0.9.2 ..< 0.10.05.9
0.10.0 ... 0.12.05.10
0.12.0 ..< 0.13.06.0
0.13.0 ..<6.1

ما الذي يدعمه SwiftNIO SSH؟

يدعم SwiftNIO SSH الإصدار SSHv2 مع مجموعة الميزات التالية:

  • جميع ميزات القناة الخاصة بالجلسة، بما في ذلك طلبات shell و exec للقناة
  • إعادة توجيه منفذ TCP المباشر والعكسي
  • البدائل التشفيرية الحديثة فقط: Ed25519 و ECDSA على المنحنيات NIST الرئيسية (P256 و P384 و P521) للتشفير غير المتماثل، و AES-GCM للتشفير المتماثل، و x25519 لتبادل المفاتيح
  • مصادقة المستخدم بكلمة مرور ومفتاح عام
  • يدعم جميع المنصات التي يدعمها SwiftNIO و Swift Crypto

كيف أستخدم SwiftNIO SSH؟

يوفر SwiftNIO SSH معالج قناة (ChannelHandler) من SwiftNIO هو NIOSSHHandler. يقوم هذا المعالج بتنفيذ الجزء الأكبر من بروتوكول SSH مباشرة. لا يُتوقع من المستخدمين إنشاء رسائل SSH مباشرة: بدلاً من ذلك، يتفاعلون مع NIOSSHHandler من خلال قنوات فرعية ومفوّضين.

SSH هو بروتوكول متعدد الإرسال: كل اتصال SSH ينقسم إلى قنوات اتصال ثنائية الاتجاه متعددة تسمى، بشكل مناسب، قنوات. يعكس SwiftNIO SSH هذا البناء باستخدام تجريد "القناة الفرعية". عندما ينشئ نظير قناة SSH جديدة، سيقوم SwiftNIO SSH بإنشاء قناة NIO جديدة (Channel) تستخدم لتمثيل كل حركة المرور على قناة SSH تلك. داخل هذه القناة الفرعية (Channel)، يتم ترتيب جميع الأحداث بدقة بالنسبة لبعضها البعض: ومع ذلك، قد يتم تداخل الأحداث في قنوات مختلفة (Channels) بحرية بواسطة التطبيق.

لذلك فإن اتصال SSH نشط يبدو كما يلي:

┌ ─ NIO Channel ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│     ┌────────────────────────────────┐    │
      │                                │
│     │                                │    │
      │                                │
│     │                                │    │
      │                                │
│     │                                │    │
      │         NIOSSHHandler          │───────────────────────┐
│     │                                │    │                  │
      │                                │                       │
│     │                                │    │                  │
      │                                │                       │
│     └────────────────────────────────┘    │                  │
                                                               │
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘                  │
                                                               │
                                                               │
                                                               │
                                                               │
                                                               ▼
                     ┌── SSH Child Channel ─────────────────────────────────────────────────────────────┐
                     │                                                                                  │
                     │   ┌────────────────────────────────┐      ┌────────────────────────────────┐     ├───┐
                     │   │                                │      │                                │     │   │
                     │   │                                │      │                                │     │   ├───┐
                     │   │                                │      │                                │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   │          User Handler          │      │          User Handler          │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   │                                │      │                                │     │   │   │
                     │   └────────────────────────────────┘      └────────────────────────────────┘     │   │   │
                     │                                                                                  │   │   │
                     └───┬──────────────────────────────────────────────────────────────────────────────┘   │   │
                         │                                                                                  │   │
                         └───┬──────────────────────────────────────────────────────────────────────────────┘   │
                             │                                                                                  │
                             └──────────────────────────────────────────────────────────────────────────────────┘

يتم استدعاء قناة SSH بنوع القناة. يدعم NIOSSH ثلاثة أنواع: session و directTCPIP و forwardedTCPIP. النوع الأكثر شيوعًا هو session: يُستخدم session لتمثيل استدعاء برنامج، سواء كان برنامجًا محددًا باسم أو شل. النوعان الآخران للقناة مرتبطان بإعادة توجيه منفذ TCP، وسيتم مناقشتهما لاحقًا.

تعمل قناة SSH على نوع بيانات واحد: SSHChannelData. يغلف هذا الهيكل حقيقة أن SSH يدعم بيانات القناة العادية و "الموسعة". يتم استخدام بيانات القناة العادية (SSHChannelData.DataType.channel) للغالبية العظمى من البيانات الأساسية. في قنوات session، يتم استخدام نوع البيانات .channel للإدخال القياسي والإخراج القياسي: يتم استخدام نوع البيانات .stdErr للخطأ القياسي (بطبيعة الحال). في قنوات إعادة توجيه TCP، يكون نوع البيانات .channel هو النوع الوحيد المستخدم، ويمثل البيانات المُعاد توجيهها.

أحداث القناة

تمثل قناة session استدعاء أمر. يتم توصيل كيفية عمل القناة بالضبط في عدد من أحداث المستخدم الواردة. الأحداث التالية مهمة:

الفئات