Xterm.js: دعم ZModem؟

تم إنشاؤها على ١٩ سبتمبر ٢٠١٦  ·  41تعليقات  ·  مصدر: xtermjs/xterm.js

دعم ZModem حتى نتمكن من استقبال / إرسال الملفات باستخدام lrzsz؟ هل هذا يبدو مثيرا للاهتمام؟

التعليق الأكثر فائدة

إذا كان بإمكاني إضافة سنتي فيما يتعلق بشكل هذا لجعله مكونًا إضافيًا xterm: أقترح عدم إضافة واجهة مستخدم على الإطلاق ، ولكن لإرسال الأشياء من خلال حدث ، على غرار تدفقات العقدة. شيء مثل

term.on('transfer', (transfer) => {

  // accept or reject the transfer
  transfer.accept();

  // listen for progress
  transfer.on('progress', ...);

  // data chunks arrive
  transfer.on('data', ...);

  // transfer has finished
  transfer.once('end', ...);

  // cancel transfer
  transfer.abort();

});

بهذه الطريقة يمكن للمستهلك بناء واجهة المستخدم الخاصة به أعلى المكون الإضافي.

ال 41 كومينتر

هل يمكنك الدخول في مزيد من التفاصيل حول كيفية عمل ذلك على xterm.js؟

أستخدم xterm.js للاتصال بـ bash (bash كامل الميزات) والسماح للمستخدم بالتفاعل مع bash. أرغب في دعم المستخدم لتحميل / تنزيل الملف من خلال محطة الويب باستخدام rz / sz.

إذا قمت بالاتصال بقشرة جهاز باستخدام SecureCRT / Xshell ، فيمكنني تحميل / تنزيل الملفات باستخدام الأمر rz / sz . أرغب في استخدام zterm.js للاتصال بصدفة الجهاز ، وتحميل / تنزيل الملفات باستخدام الأمر rz / sz

Zmodem هي ميزة بروتوكول هي تجريد الخط التسلسلي الأساسي لنظام PTY. هذا قابل للاستخدام بالفعل مع أدوات مثل zssh في xterm.js. يقوم xterm.js نفسه بإعادة توجيه الإدخال / الإخراج الرئيسي لـ PTY إلى المتصفح. في الواقع ، أنت تعمل على النظام حيث يتم استضافة جزء خادم xterm.js.

هذا يختلف تمامًا عن المحاكي الطرفي الذي يعمل على نفس الجهاز مثل SecureCRT.

لذا فإن السؤال هو - من أي جهاز إلى أي جهاز تريد نقل الملفات عبر الجهاز؟ (تذكر أن جهازك المحلي لا يحتوي على قناة طرفية لجزء الخادم من xterm.js).

|       local machine               |
|   +----------------------------+  |
|   |       browser              |  |
|   |   +-------------------+    |  |               +---------------------------+          +------------------------+
|   |   |                   |    |  |               |   proxy                   |          |                        |
|   |   |   web terminal    >----------------------->   server part of xterm.js >----------| romote machine terminal|
|   |   |                   |    |  |               +---------------------------+          +------------------------+
|   |   |                   |    |  |
|   |   +-------------------+    |  |
|   +----------------------------+  |
+-----------------------------------+

أرغب في نقل الملفات من الجهاز المحلي إلى الجهاز البعيد. لا يمكن الوصول إلى الآلة البعيدة عن طريق الآلة المحلية مباشرة ، حيث لا تحتوي على عنوان IP خارجي.

تذكر أن جهازك المحلي لا يحتوي على قناة طرفية لجزء الخادم من xterm.js

هل هناك أي حل بديل لهذا؟

حسنًا ، يمكنك استخدام zssh (مع دعم zmodem) أو sftp أو scp من الوكيل.

ما لم ينفذه شخص ما ، فلا توجد طريقة لرفع / تنزيل الملفات مباشرة من webterminal في متصفحك إلى الجهاز البعيد. يمكن استخدام أحد بروتوكولات المودم بهذه الطريقة (هناك تطبيق XModem JS) ، ولكن نظرًا لأن المتصفح لديه وصول محدود جدًا إلى نظام الملفات ، فإنني أتساءل عن فائدته. يتمثل الجزء الصعب في توفير تفاعل تنزيل مع المتصفح للملفات الكبيرة (نظرًا لأن البيانات تهبط مباشرة في المتصفح من خلال Websocket ، سيتعين على JS الاحتفاظ بجميع البيانات حتى يمكن حفظها.)

هناك طريقة أخرى تتمثل في تحسين جزء الخادم بوظيفة rz / sz وتعيين ذلك بشفافية إلى المتصفح. قد يتحايل هذا على قيود FS للمستعرض ولكنه يحتاج إلى ربط محلل آخر في التدفق الطرفي للقبض على التهيئة "rz \ r" لبروتوكولات المودم.

لقد كنت أعمل على تطبيق ZMODEM في JavaScript وجعلته ينقل الملفات في كلا الاتجاهين عبر xterm.js.

يجب على المستعرض بالفعل تخزين الملف بأكمله مؤقتًا عند استلامه. :( هذا هو الجانب السلبي الوحيد حقًا ، على الرغم من أنه ليس سيئًا إلا إذا كنت ترسل ملفات كبيرة جدًا. يمكن إجراء عمليات التحميل عبر FileReader ، ويتم التنزيل عبر سمة "download" لعناصر <a> .

ما زلت أختبرها وأوثقها ، لكن هل تكامل ZMODEM ميزة تهم xterm.js؟

FGasper Nice :) يبدو واعدًا ، إذا قمت بتطبيقه باستخدام واجهة برمجة تطبيقات دفق العقدة ، فقد يكون مفيدًا أيضًا للملفات الكبيرة

المكتبة نفسها لا تعتمد على النظام الأساسي ، لذا يجب أن تعمل في أي مكان. (دق على الخشب.)

FGasper يبدو أنيق 😄!

يمكننا بالتأكيد التفكير في ملحق zmodem ، إذا كان يعمل في المتصفح.

ما هي عادة حالات الاستخدام لاستخدام zmodem؟

أستخدمه لإجراء عمليات نقل الملفات داخل جلسة طرفية إلى / من محطة العمل الخاصة بي. يسمح لك بعدم الاضطرار إلى scp / sftp أو ما لا.

مشابه لهذا لـ iTerm2:
https://github.com/mmastrac/iterm2-zmodem

parisk تسمح بروتوكولات X / Y / Z-MODEM "بإساءة استخدام" اتصال طرفي لنقل الملفات المباشر من وإلى الجانب الآخر. هذا مفيد للغاية إذا كنت ترغب في تنظيم خادم فقط من خلال جلسة طرفية واحدة. بالنسبة لأنظمة POSIX ، هناك أدوات rz / sz لإنجاز ذلك.

حسنًا بالنسبة إلى xterm.js ، فهو ملحق مثالي ، حيث سيزيد من فائدة xterm.js لمشرفي الخادم في البيئات المقيدة. : +1:

ملحوظة: يحتوي كل من XMODEM و YMODEM على عيب عدم "مطالبة" الجانب الآخر بوجود نقل ملف جاهز. (إنه أمر مؤسف لأنها أبسط بكثير!)

يرسل ZMODEM ما هو في الأساس "سلسلة سحرية" يمكن مراقبتها ؛ ثم تقوم بمطالبة المستخدم ، "تم اكتشاف ZMODEM ؛ المضي قدما في نقل الملف؟ " عند هذه النقطة ، يوفر التنفيذ وسائل إما لتوفير الملفات لنقلها أو لقبول / تخطي الملفات كما يقدمها المرسل.

بالنسبة إلى xterm.js ، سيكون أمرًا رائعًا أن تقوم فقط بسحب وإسقاط الملفات في الجهاز - دعنا نقول أن الملف يتم حفظه في مسار قذيفة المحطة الطرفية الحالي. ولكن من الصعب جدًا تحقيق ذلك ما لم يتمكن xterm.js من التحكم في الغلاف البعيد نفسه أو على الأقل الحصول على دليل العمل الحالي في أي وقت. ينطبق الأمر نفسه على الإصدارات السابقة - إذا كان من الممكن اكتشاف قائمة ls على أنها تشير إلى الملفات البعيدة ، فسيكون السحب والإفلات من الجهاز أمرًا رائعًا. حسنًا ، أحلم فقط: غمزة:

لا أرى سبب عدم إمكانية السحب / الإفلات rz بمجرد بدء جلسة Zmodem. يمكن تنفيذه بعدة طرق ، ولكن ربما:

1) اكتب rz في وحدة التحكم الخاصة بك.
2) قم بسحب / إسقاط الملفات بتنسيق.
3) ابدأ النقل.

السؤال: ما مدى استمرار xterm.js في دعم IE؟

لا مزيد من دعم IE في الإصدار 3 بسبب https://github.com/sourcelair/xterm.js/pull/938 ، يجب على المطورين إيقافه على أي حال.

أود أن أريكم عرضًا تجريبيًا للناس.

لقد قمت باختبار الخادم الطرفي الخاص بي ولكني أرغب في استخدام كل ما لديكم كإعداد افتراضي.

image
^^ هل فاتني شيء هنا؟ npm install خطأ بالنسبة لي…

felipe@Macintosh-4 18:00:56 ~/code/p5-Net-WebSocket/demo
> sudo npm install
npm ERR! install Couldn't read dependencies
npm ERR! Darwin 16.7.0
npm ERR! argv "/opt/local/bin/node" "/opt/local/bin/npm" "install"
npm ERR! node v8.3.0
npm ERR! npm  v2.15.12
npm ERR! path /Users/felipe/package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno -2
npm ERR! syscall open

npm ERR! package.json ENOENT: no such file or directory, open '/Users/felipe/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/felipe/code/p5-Net-WebSocket/demo/npm-debug.log

ربما نسيت git clone ... ؟ ولماذا مع sudo ؟

تضمين التغريدة

npm ERR! package.json ENOENT: no such file or directory, open '/Users/felipe/package.json'

أنت تقوم بتشغيل npm install في دليلك الرئيسي ، وليس دليل الريبو.

هل هناك طريقة للحصول على node-pty لإخراج ثنائي بدلاً من سلاسل؟ ZMODEM هو بروتوكول ثنائي ، ولكن يبدو أن العرض التوضيحي يعتقد أن كل شيء هو UTF-8. على وجه الخصوص ، يبدو أن شيئًا ما يتم تحويل 0x8a إلى UTF-8 \ ufffd

قد يكون هذا أكثر أهمية - للإصلاح السريع ، يمكنك محاولة تعطيل ترميز node-pty أو ضبط نوع السلسلة على "ثنائي" ، ولكن هذا قد يكون له تأثيرات غير مرغوب فيها على نقل مقبس الويب إلى xterm.js. بقدر ما أستطيع أن أقول إن السلسلة بأكملها node-pty <---> websocket <---> xterm.js تعتمد على UTF-8 بايت التي يتم فك تشفيرها إلى سلاسل JS أثناء الطيران. قد تحتاج إلى تصحيح أكبر لتدفق البيانات الثنائية.

أين هو إعداد نوع السلسلة binary ؟ (أنا لا أرى مثل هذا في عقدة pty؟)

أفضل ما يمكنني قوله هو أن البيانات تالفة بالفعل في الوقت الذي تصل فيه إلى app.js ، لذلك يجب أن يكون التغيير في السلوك في node-pty.

يوضح ZMODEM بالفعل ترميزًا يهرب من جميع الأحرف عالية البت وصولاً إلى 7 بتات ، ولكن يبدو أنه لم يتم تنفيذه فعليًا على الإطلاق ... ربما اعتقد فورسبرج أنه لن تكون هناك حاجة إليه أبدًا لأن جميع الأسطر أصبحت آمنة 8 بت ، هيه. :)

يمكنك المحاولة باستخدام {encoding: 'binary'} في خيارات ctor أو .setEncoding('binary') أثناء التنقل.

يبدو أن أحدث عقدة pty تسمح بتعيين أو عدم ضبط وضع UTF8 ...

  if (info[8]->ToBoolean()->Value()) {
#if defined(IUTF8)
    term->c_iflag |= IUTF8;
#endif
}

https://github.com/Tyriar/node-pty/blob/master/src/unix/pty.cc

حسنًا ... العقدة التي يسحبها xterm.js (0.4.1) قديمة جدًا ... ربما تتضمن أحدث نسخة هذه العلامة.

استدعاء .setEncoding('binary') لا يعمل… ولا تمرير encoding:"binary" إلى pty.spawn ().

IUTF8 من termios تفعل شيئًا مختلفًا - فهي تتيح المعالجة الصحيحة لأحرف UTF8 متعددة البايت في جهاز pty (لعرض الخط ومحوه).
ربما تكون الطريقة الصعبة - حاول إزالة برنامج التشفير:

delete ptyObj._socket._readableState.decoder;
delete ptyObj._socket._readableState.encoding;

يجب أن يمنحك هذا كائنات عازلة بدلاً من سلاسل (على الأرجح أن تنفصل لأعلى إلى xterm.js).

حسنًا ، لقد حصلت عليه من خلال الترقية إلى node-pty 0.6.4 وتعيين الترميز على null . (لم أكن بحاجة إلى عناصر _readableState .) لا يزال يرسل السطر الأول من جلسة shell كنص ، لكن كل شيء بعده ثنائي ، رائع جدًا.

لا يزال يرسل السطر الأول من جلسة shell كنص ...

حتى إذا قمت بتطبيقه على المُنشئ كـ {encoding: null} ؟

نعم ، حتى مع {encoding: null} يتم إرسال السطر الأول كإطار نصي.

لقد حصلت على هذا في ما أعتقد أنه حالة معقولة لتجربته.

1) قم بإعداد https://github.com/FGasper/xterm.js.git كجهاز تحكم عن بعد.
2) تحقق من فرع الريبو zmodem .
3) git submodule init; git submodule update
4) npm install (انظر أدناه).
5) npm start ، ثم حمل localhost:3000 في المتصفح. (Chrome هو ما اختبرته.)
6) ssh إلى جهاز مثبت عليه lrzsz .
7) اكتب rz ، وأرسل ملفًا واحدًا أو أكثر من محطة العمل الخاصة بك إلى جهاز التحكم عن بُعد.
8) sz <filename1> <filename2> … سيرسل الملفات دفعة واحدة إلى محطة العمل الخاصة بك.

(تعد واجهة المستخدم في حدها الأدنى حسب التصميم ؛ من المفترض أن النشر "الحقيقي" سيصقلها أكثر.)

فيما يتعلق بالخطوة 4: عندما اختبرت الآن للتو على محطة العمل الخاصة بي ، اضطررت إلى إصلاح مشكلة الأذونات مع الحزمة node-gyp .

رائع ، يعمل مثل السحر (تم اختباره باستخدام ملفات نصية في Firefox).

فقط بعض الملاحظات:

  • هل من الممكن تشغيل تسلسل init عن طريق الصدفة (مثل إخراج البيانات العشوائية)؟ إذا كان الأمر كذلك ، فستحتاج المحطة الطرفية IMHO إلى إعداد "إدخال نقل الملفات" لتوضيح ذلك.
  • يجب أن تكون "جلسة بدء ZMODEM" قابلة للمقاطعة ، وتحديد "لا" لا يؤدي إلى إحباط rz على الطرف الآخر من أجهزة الصراف الآلي.
  • هل من الممكن رسم بعض شريط التقدم / المؤشر في القطعة الطرفية أثناء استمرار النقل؟ أو بعض الأشياء الفاخرة الأخرى ، atm rz/sz تطبع بعض أرقام الحالة الغريبة في المحطة.

تضمين التغريدة

1) نعم ، من الممكن تشغيل تسلسل البادئة عن طريق الصدفة. هذا هو الغرض من مطالبة "بدء جلسة ZMODEM": لا يزال بإمكان المستخدم التراجع إذا لزم الأمر.

2) يجب إصلاحه الآن.

3) يتلقى التطبيق أحداث progress متزامنة مع واجهة برمجة تطبيقات FileReader الخاصة بالمتصفح. يبدو أن Chrome يعطي محتوى بـ progress ؛ ومع ذلك ، فإن Firefox لا يعطي محتوى الملف بالفعل في تلك الأحداث. إذا أرسلت لنفسك ملفًا كبيرًا بشكل مناسب في Chrome ، فسترى شيئًا مثل:
image

4) الأحرف الغريبة في بداية الجلسة هي الأجزاء القابلة للطباعة من تسلسل استلام ZMODEM: ** + ASCII CAN + B01 + 10 أحرف سداسية + CR + 0x8a + XON. أوافق على أنه من القبيح أن يذهبوا إلى الشاشة ؛ ومع ذلك ، فهي قياسية جدًا في محطات ZMODEM-smart التي استخدمتها. أفترض أنه يمكنه إرسال أحرف BS كافية إلى الجهاز لحذف هذه الأحرف؟

هناك أيضًا حاجة لإضافة عنصر تحكم لإلغاء نقل قيد التقدم. ما زلت أبحث عن أفضل طريقة للتعامل مع ذلك.

هناك أيضًا حاجة لإضافة عنصر تحكم لإلغاء نقل قيد التقدم. ما زلت أبحث عن أفضل طريقة للتعامل مع ذلك.

ربما هذا من المواصفات يساعد؟

A ZFIN, ZABORT, or TIMEOUT terminates the session; a ZSKIP terminates the processing of
this file.

يحتمل. المواصفات ليست دائمًا الشيء الأكثر فائدة ؛ على سبيل المثال ، يذكر تسلسل Attn الذي يتم إرساله بعد ZSINIT. يبدو أن المواصفات تشير إلى أن هذه هي الطريقة التي تجعل المرسل يوقف إرسال البيانات مؤقتًا ، ولكن يبدو أن لا شيء يستخدم Attn فعليًا. وبالمثل مع خيار ESC8: لم يتم تنفيذه فعليًا في lrzsz ، وبما أن هذا هو التطبيق المرجعي الفعلي ، فإن ESC8 غير قابل للاستخدام - وهو أمر مخز لأنه سيعمل بشكل جيد على حل هذه المشكلة مع علامة termios IEXTEN.

أنا في فترة زمنية قصيرة في مشاريع أخرى الآن ولكني آمل أن أعود إلى هذا الأسبوع المقبل.

إذا كان بإمكاني إضافة سنتي فيما يتعلق بشكل هذا لجعله مكونًا إضافيًا xterm: أقترح عدم إضافة واجهة مستخدم على الإطلاق ، ولكن لإرسال الأشياء من خلال حدث ، على غرار تدفقات العقدة. شيء مثل

term.on('transfer', (transfer) => {

  // accept or reject the transfer
  transfer.accept();

  // listen for progress
  transfer.on('progress', ...);

  // data chunks arrive
  transfer.on('data', ...);

  // transfer has finished
  transfer.once('end', ...);

  // cancel transfer
  transfer.abort();

});

بهذه الطريقة يمكن للمستهلك بناء واجهة المستخدم الخاصة به أعلى المكون الإضافي.

mofux هكذا أريد أن يعمل هذا أيضًا. تهدف مكونات واجهة المستخدم التي وضعتها في العرض التوضيحي فقط إلى إظهار عناصر التحكم.

تضمين التغريدة

سأضيف دعم ZModem لـ ttyd عندما يكون api جاهزًا للاستخدام (https://github.com/tsl0922/ttyd/issues/37) ، شكرًا لعملك.

https://www.npmjs.com/package/zmodem.js

لقد قمت بإصدار ALPHA من zmodem.js. من هنا سألقي نظرة على واجهة البرنامج المساعد لـ xterm.js ، ولكن أي شخص يريد إلقاء نظرة على zmodem.js ، فلا تتردد في القيام بذلك وإخباري كيف يعمل من أجلك.

تم الآن دمج الملحق ZMODEM ، لمعلوماتك.

نظام win7

$ npm run start-zmodem

> [email protected] start-zmodem E:\test\xterm\xterm.js
> node demo/zmodem/app

App listening to http://127.0.0.1:3100

لماذا لا يمكن فتح مستكشف الملفات؟
default

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات