عميل 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 الآمنة.