عميل SSH — ssh / sc

عميل SSH تفاعلي حقيقي يعمل على T-Deck، مبنيّ على منفذ LibSSH-ESP32 لمكتبة libssh (النسخة 0.11.x). تشفير حديث كامل — تبادل مفاتيح curve25519/ECDH، وشيفرات AES/ChaCha20، ومفاتيح مضيف ed25519/RSA — باستخدام تسريع AES/SHA العتادي في ESP32-S3. يعمل على كلا الجهازين T-Deck و T-Deck Plus.

CMD> cw 3                 # الاتصال بـ WiFi أوّلًا
CMD> ssh 192.168.1.10 pi  # ثم الدخول عبر SSH

الاستخدام

ssh <ip|name> [user]                  # الاتصال (name = ملفّ محفوظ)
ssh save <name> <ip> [user] [port]    # حفظ/تحديث ملفّ مضيف
ssh list                              # سرد الملفّات المحفوظة
ssh rm <name>                         # حذف ملفّ
  • الاتصال يتطلّب اتصال WiFi STA فعّالًا — شغّل cw <index> أوّلًا (يعيد العميل استخدام ذلك الاتصال؛ ولا يمسّ وضع WiFi). أمّا الأوامر الفرعية save/list/rm فتعمل بلا WiFi.
  • إن حُذِف user طُلِب منك؛ وكلمة المرور تُطلَب دائمًا (مُقنَّعة).
  • يستغرق الاتصال + تبادل المفاتيح نحو 1–3 ثوانٍ.

ملفّات المضيفين المحفوظة

بدل إعادة كتابة IP والمستخدم كل مرّة، احفظ ملفًّا باسم:

CMD> ssh save nas 192.168.1.50 admin
CMD> ssh nas                          # يتّصل بـ admin@192.168.1.50، يطلب كلمة المرور
  • تُخزَّن في /apps/ssh/hosts.csv بصيغة name,ip,port,user — ولا تُحفَظ كلمات المرور أبدًا (ملفّ نصّي على بطاقة قابلة للإزالة)؛ تُطلَب دائمًا.
  • الاسم المجرّد (ssh nas) يُحَلّ من قائمة الملفّات أوّلًا؛ وما لا يُوجَد يُستخدَم مباشرةً كـ IP/اسم مضيف، فيبقى ssh 192.168.1.10 وssh example.com عاملين.
  • أسبقية المستخدم: الوسيط الصريح يتجاوز مستخدم الملفّ، الذي يتجاوز الطلب. وتُحفَظ المنافذ المخصّصة لكل ملفّ (ssh save vps 203.0.113.9 root 2222).
  • الإكمال التلقائي يُكمِل الأسماء المحفوظة: ssh ' يسرد save list rm + أسماء مضيفيك، وssh n'ssh nas.

الطرفية

طرفية ملوّنة مع تمرير للخلف، مرسومة على شاشة 320×240 (نحو 52×13 حرفًا):

الإدخال الإجراء
الكتابة تُرسَل مباشرةً إلى الصَّدَفة البعيدة
كرة التتبّع للأعلى / للأسفل تمرير عبر 120 سطرًا من السجلّ
نقر كرة التتبّع قطع الاتصال
  • دعم ANSI بـ 16 لونًاls الملوّن، والمِحثّات، وgrep --color تظهر بألوانها الحقيقية؛ والنصّ الافتراضي رمادي فاتح. وتُخفَّض شيفرات 256 لونًا/الألوان الحقيقية أو تُتخطّى.
  • شريط تمرير على الحافّة اليمنى (سماوي؛ أصفر مع وسم [SCROLL -N] أثناء تمريرك للخلف). والكتابة تُعيدك للبثّ الحيّ.
  • محرّك VT100 مصغّر يتولّى الأسطر الجديدة و CR و Backspace والجداول وتحريك المؤشّر ومسح السطر/الشاشة. جيّد للصَّدَفات وls وcat وpwd وgit ومديري الحزم. أمّا واجهات TUI كاملة الشاشة (vim وhtop) فتُرسَم تقريبيًّا حاليًّا.

كيف يعمل

تحتاج libssh مكدّسًا كبيرًا، فتعمل الجلسة كاملة في مهمّة FreeRTOS مخصّصة (نحو 50 KB) بينما تنتظرها واجهة الأوامر. وذاكرة PSRAM في ESP32-S3 تغطّي كومة libssh بأريحية.

ملاحظات أمنية

  • تُمحى كلمة المرور من الذاكرة عند انتهاء الجلسة.
  • التحقّق من مفتاح المضيف مُتخطّى حاليًّا (ثقة عند أوّل استخدام، بلا تثبيت). وتثبيت known_hosts والمصادقة بالمفتاح العامّ مخطَّطان (تحت /apps/ssh/: known_hosts وkeys/).
  • لا يوجد Ctrl-C بعد (لوحة I2C لا تُصدِر أحرف التحكّم بسهولة) — فنقر كرة التتبّع لقطع الاتصال هو مخرج الأمر البعيد الطويل.

الاستقرار

توصي وثائق المكتبة بتعطيل CONFIG_MBEDTLS_HARDWARE_SHA للاستقرار تحت التزامن، وهو غير ممكن مع نواة Arduino المُصرَّفة مسبقًا. ويتقاسم تشفير SSH و WiFi محرّك SHA العتادي الوحيد، فإن حدث انهيار أثناء طور الاتصال/تبادل المفاتيح، فذلك المحرّك المشترك هو المُشتبَه الأوّل.

تخطيط SD

يُنشَأ /apps/ssh/ عند أوّل إقلاع/تهيئة.

  • hosts.csv — ملفّات المضيفين المحفوظة (منفّذ؛ name,ip,port,user).
  • known_hosts وkeys/ — تثبيت مفتاح المضيف والمصادقة بالمفتاح (مخطَّط).

تحدث قراءات/كتابات الملفّات وقت الأمر (WiFi خامل)، لا أثناء جلسة حيّة، فتكون ضمن نافذة وصول SD الآمنة.