Xterm.js: Dukungan ZModem?

Dibuat pada 19 Sep 2016  ·  41Komentar  ·  Sumber: xtermjs/xterm.js

mendukung ZModem sehingga kami dapat menerima/mengirim file menggunakan lrzsz? Apakah ini terdengar menarik?

Komentar yang paling membantu

Jika saya dapat menambahkan dua sen saya mengenai bentuk ini untuk menjadikannya plugin xterm: Saya akan mengusulkan untuk tidak menambahkan UI sama sekali, tetapi untuk mengirimkan sesuatu melalui suatu acara, mirip dengan aliran simpul. Sesuatu seperti

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();

});

Dengan cara ini konsumen dapat membangun UI sendiri di atas plugin.

Semua 41 komentar

Bisakah Anda masuk ke beberapa detail lebih lanjut tentang bagaimana ini akan bekerja di xterm.js?

Saya menggunakan xterm.js untuk terhubung ke bash (bash fitur lengkap) dan membiarkan pengguna berinteraksi dengan bash. Saya ingin mendukung pengguna untuk mengunggah/mengunduh file melalui terminal web dengan menggunakan rz/sz.

Jika saya terhubung ke shell mesin dengan SecureCRT/Xshell, saya dapat mengunggah/mengunduh file dengan perintah rz / sz . Saya ingin menggunakan zterm.js untuk terhubung ke shell mesin, dan mengunggah/mengunduh file dengan perintah rz / sz

Zmodem adalah fitur protokol yang mendasari abstraksi garis serial dari sistem PTY. Ini sudah dapat digunakan dengan alat seperti zssh di xterm.js. xterm.js sendiri hanya meneruskan master IO dari PTY ke browser. Pada kenyataannya Anda beroperasi pada sistem tempat bagian server xterm.js di-host.

Ini sangat berbeda dengan emulator terminal yang beroperasi pada mesin yang sama seperti yang dilakukan SecureCRT.

Jadi pertanyaannya adalah - Dari mesin mana ke mesin mana Anda ingin memindahkan file melalui terminal? (Ingat mesin lokal Anda tidak memiliki saluran terminal ke bagian server dari xterm.js).

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

Saya ingin memindahkan file dari mesin lokal ke mesin jarak jauh. Mesin remote tidak dapat diakses oleh mesin lokal secara langsung, karena tidak memiliki ip eksternal.

Ingat mesin lokal Anda tidak memiliki saluran terminal ke bagian server xterm.js

Apakah ada solusi untuk ini?

Anda dapat menggunakan zssh (dengan dukungan zmodem), sftp atau scp dari proxy.

Kecuali seseorang mengimplementasikannya, tidak ada cara untuk menaikkan/mengunduh file langsung dari terminal web di browser Anda ke mesin jarak jauh. Salah satu protokol modem dapat digunakan seperti itu (ada implementasi XModem JS), tetapi karena browser memiliki akses sistem file yang sangat terbatas, saya mempertanyakan kegunaannya. Bagian yang sulit adalah menyediakan interaksi unduhan dengan browser untuk file besar (karena data mendarat langsung di browser melalui websocket, JS harus menyimpan semua data hingga dapat disimpan.)

Pendekatan lain adalah meningkatkan bagian server dengan fungsionalitas rz/sz dan memetakannya secara transparan ke browser. Ini akan menghindari batasan FS browser tetapi perlu menghubungkan parser lain ke aliran terminal untuk menangkap inisialisasi 'rz\r' dari protokol modem.

Saya telah mengerjakan implementasi ZMODEM dalam JavaScript dan membuatnya mentransfer file di kedua arah melalui xterm.js.

Browser memang harus menyangga seluruh file saat diterima. :( Itu benar-benar satu-satunya downside, dan itu tidak buruk kecuali Anda mengirim file yang sangat besar. Upload dapat dilakukan melalui FileReader, dan download terjadi melalui "download" atribut elemen <a> .

Saya masih menguji dan mendokumentasikannya, tetapi apakah integrasi ZMODEM merupakan fitur yang menarik bagi xterm.js?

@FGasper Bagus :) Kedengarannya menjanjikan, jika Anda menerapkannya dengan API aliran simpul, itu juga dapat berguna untuk file besar sebagai ekstensi sisi server, yang mem-proksi file-file itu ke titik akhir browser melalui tautan unduhan.

Perpustakaan itu sendiri adalah platform-agnostik, jadi itu harus bekerja di mana saja. (Amit-amit.)

@FGasper terdengar rapi !

Kami pasti dapat mempertimbangkan addon zmodem, jika berfungsi di browser.

Apa saja kasus penggunaan untuk menggunakan zmodem?

Saya menggunakannya untuk melakukan transfer file dalam sesi terminal ke/dari workstation saya. Ini memungkinkan Anda untuk tidak perlu scp/sftp atau yang tidak.

Mirip dengan ini untuk iTerm2:
https://github.com/mmastrac/iterm2-zmodem

@parisk Protokol X/Y/Z-MODEM memungkinkan untuk "menyalahgunakan" koneksi terminal untuk transfer file langsung dari dan ke sisi lain. Ini sangat berguna jika Anda ingin mengatur server hanya melalui satu sesi terminal. Untuk sistem POSIX ada alat rz / sz untuk mencapai ini.

Nah untuk xterm.js ini adalah addon yang sempurna, ini akan meningkatkan kegunaan xterm.js untuk admin server di lingkungan terbatas. :+1:

NB: XMODEM dan YMODEM keduanya memiliki kekurangan yaitu tidak "mendorong" sisi lain bahwa ada file yang siap transfer. (Sangat disayangkan karena mereka jauh lebih sederhana!)

ZMODEM mengirimkan apa yang pada dasarnya adalah "string ajaib" yang dapat diawasi; lalu Anda meminta pengguna, “ZMODEM terdeteksi; lanjutkan dengan transfer file?” Pada saat itu implementasi menyediakan sarana untuk menyediakan file untuk ditransfer atau untuk menerima/melewati file seperti yang ditawarkan pengirim.

Untuk xterm.js itu akan rapi untuk hanya drag'n drop file ke terminal - katakanlah file akan disimpan di jalur shell terminal saat ini. Tapi itu sangat sulit untuk dicapai kecuali xterm.js dapat mengontrol shell jarak jauh itu sendiri atau setidaknya mengambil direktori kerja saat ini kapan saja. Hal yang sama berlaku untuk mundur - jika daftar ls dapat terlihat mengacu pada file jarak jauh, drag'n drop out dari terminal akan rapi. Yah cuma mimpi :wink:

Saya tidak mengerti mengapa drag/drop rz tidak dapat dilakukan setelah sesi Zmodem dimulai. Itu bisa diimplementasikan dengan berbagai cara, tapi mungkin:

1) Ketik rz ke konsol Anda.
2) Seret/lepas file.
3) Mulai transfer.

Pertanyaan: Bagaimana set xterm.js masih pada dukungan IE?

Tidak ada lagi dukungan IE di v3 karena https://github.com/sourcelair/xterm.js/pull/938 , pengembang tetap harus mematikannya.

Saya ingin menunjukkan kepada Anda sebuah demo.

Saya telah menguji terhadap server terminal saya sendiri tetapi ingin menggunakan apa pun yang kalian miliki sebagai default.

image
^^ Apakah saya melewatkan sesuatu di sini? npm install kesalahan keluar untuk saya ...

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

Mungkin Anda lupa git clone ... ? Dan mengapa dengan sudo ?

@FGasper

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

Anda menjalankan npm install di direktori home Anda, bukan direktori repo.

Apakah ada cara untuk membuat node-pty menghasilkan biner daripada string? ZMODEM adalah protokol biner, tetapi demo tampaknya menganggap semuanya adalah UTF-8. Secara khusus, sesuatu tampaknya mengonversi 0x8a ke UTF-8 \ufffd

Ini mungkin sedikit lebih melibatkan - untuk perbaikan cepat Anda dapat mencoba menonaktifkan pembuat enkode node-pty atau mengatur jenis string ke 'biner', tetapi ini mungkin memiliki dampak yang tidak diinginkan pada transfer soket web ke xterm.js. Sejauh yang saya tahu seluruh rantai node-pty <---> websocket <---> xterm.js bergantung pada byte UTF-8 yang diterjemahkan ke string JS dengan cepat. Mungkin perlu patch yang lebih besar untuk membuat data biner mengalir.

Di mana pengaturan tipe string binary ? (Saya tidak melihat seperti itu di node-pty?)

Seperti yang saya tahu, data sudah rusak pada saat mencapai app.js , jadi perubahan perilaku harus di node-pty.

ZMODEM memang menguraikan pengkodean yang lolos dari semua karakter bit tinggi ke 7-bit, tetapi tampaknya tidak pernah benar-benar diimplementasikan ... Forsberg mungkin mengira itu tidak akan pernah diperlukan karena semua baris menjadi 8-bit aman, heh. :)

Anda dapat mencoba dengan {encoding: 'binary'} dalam opsi ctor atau .setEncoding('binary') dengan cepat.

Sepertinya node-pty terbaru memungkinkan pengaturan atau tidak pengaturan mode 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

Hm … node-pty yang ditarik oleh xterm.js (0.4.1) cukup lama … mungkin versi terbaru akan menyertakan flag itu.

Memanggil .setEncoding('binary') tidak berhasil … dan juga tidak meneruskan encoding:"binary" ke pty.spawn().

IUTF8 dari termios melakukan hal yang berbeda - ini memungkinkan penanganan yang benar dari karakter UTF8 multi byte di perangkat pty (untuk lebar garis dan penghapusan).
Hmm mungkin cara yang sulit - coba hapus encoder:

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

Ini akan memberi Anda objek buffer alih-alih string (kemungkinan besar akan pecah menjadi xterm.js).

OK, saya mendapatkannya dengan memutakhirkan ke node-pty 0.6.4 dan mengatur penyandian ke null . (Tidak membutuhkan barang _readableState .) Itu masih mengirim baris pertama dari sesi shell sebagai teks, tetapi semuanya setelahnya adalah biner, sangat keren.

Itu masih mengirim baris pertama sesi Shell sebagai teks ...

Bahkan jika Anda menerapkannya ke konstruktor sebagai {encoding: null} ?

Ya, bahkan dengan {encoding: null} baris pertama dikirim sebagai bingkai teks.

Saya telah memasukkan ini ke dalam apa yang menurut saya adalah keadaan yang masuk akal untuk mencobanya.

1) Siapkan https://github.com/FGasper/xterm.js.git sebagai remote.
2) Periksa cabang zmodem repo itu.
3) git submodule init; git submodule update
4) npm install (Lihat di bawah.)
5) npm start , lalu muat localhost:3000 di browser. (Chrome adalah yang telah saya uji.)
6) ssh ke mesin yang telah menginstal lrzsz .
7) Ketik rz , dan kirim satu atau lebih file dari workstation Anda ke remote.
8) sz <filename1> <filename2> … akan mengirim file dalam batch ke workstation Anda.

(UI minimal berdasarkan desain; diasumsikan penerapan "nyata" akan lebih memolesnya.)

Mengenai langkah 4: Ketika saya baru saja menguji di workstation saya, saya harus memperbaiki masalah izin dengan paket node-gyp .

Bagus, berfungsi seperti pesona (diuji dengan file teks di Firefox).

Hanya beberapa komentar:

  • Apakah mungkin untuk memicu urutan init secara tidak sengaja (misalnya output data acak)? Jika demikian, terminal akan IMHO memerlukan pengaturan "masukkan transfer file" untuk membuatnya eksplisit.
  • "Mulai sesi ZMODEM" harus dapat diinterupsi, memilih "Tidak" tidak akan membatalkan rz pada atm ujung lainnya.
  • Apakah mungkin untuk menggambar beberapa bilah kemajuan/indikator ke dalam widget terminal saat transfer sedang berlangsung? Atau barang mewah lainnya, atm rz/sz mencetak beberapa nomor status aneh ke terminal.

@jerch

1) Ya, mungkin saja memicu urutan init secara tidak sengaja. Untuk itulah prompt "Mulai sesi ZMODEM": pengguna masih dapat mundur jika perlu.

2) Harus diperbaiki sekarang.

3) Aplikasi menerima peristiwa progress sinkron dengan API FileReader browser. Chrome tampaknya memberikan konten dengan progress ; namun, Firefox sebenarnya tidak memberikan konten file dalam acara tersebut. Jika Anda mengirim sendiri file besar yang sesuai di Chrome, Anda akan melihat sesuatu seperti:
image

4) Karakter aneh di awal sesi adalah bagian yang dapat dicetak dari urutan terima-init ZMODEM: ** + ASCII CAN + B01 + 10 karakter hex + CR + 0x8a + XON. Saya setuju bahwa itu jelek bahwa mereka pergi ke layar; namun, ini cukup standar di terminal mengerti ZMODEM yang saya gunakan. Saya kira itu bisa mengirim cukup banyak karakter BS ke terminal untuk menghapus karakter itu?

Ada juga kebutuhan untuk menambahkan kontrol untuk membatalkan transfer yang sedang berlangsung. Saya masih mencari cara terbaik untuk mengatasinya.

Ada juga kebutuhan untuk menambahkan kontrol untuk membatalkan transfer yang sedang berlangsung. Saya masih mencari cara terbaik untuk mengatasinya.

Mungkin ini dari spesifikasi membantu?

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

Berpotensi. Spesifikasi tidak selalu merupakan hal yang paling membantu; misalnya, menyebutkan urutan Attn yang dikirim setelah ZSINIT. Spesifikasi tampaknya menunjukkan bahwa itulah cara membuat pengirim menjeda pengiriman data, tetapi tampaknya tidak ada yang benar-benar menggunakan Attn. Demikian juga dengan opsi ESC8: itu tidak benar-benar diimplementasikan di lrzsz , dan karena itulah implementasi referensi de facto, ESC8 tidak dapat digunakan—yang memalukan karena akan mengatasi masalah itu dengan baik dengan flag termios IEXTEN.

Saya sedang dalam sedikit krisis waktu pada proyek-proyek lain sekarang tetapi berharap untuk kembali ke minggu depan ini.

Jika saya dapat menambahkan dua sen saya mengenai bentuk ini untuk menjadikannya plugin xterm: Saya akan mengusulkan untuk tidak menambahkan UI sama sekali, tetapi untuk mengirimkan sesuatu melalui suatu acara, mirip dengan aliran simpul. Sesuatu seperti

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();

});

Dengan cara ini konsumen dapat membangun UI sendiri di atas plugin.

@mofux Begitulah cara saya ingin ini berfungsi juga. Komponen UI yang saya masukkan ke dalam demo dimaksudkan hanya untuk mendemonstrasikan kontrol.

@FGasper Kerja bagus 👍

Saya akan menambahkan dukungan ZModem untuk ttyd ketika api Anda siap digunakan (https://github.com/tsl0922/ttyd/issues/37), terima kasih atas pekerjaan Anda.

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

Saya telah membuat rilis ALPHA dari zmodem.js. Dari sini saya akan melihat antarmuka plugin untuk xterm.js, tetapi siapa pun yang ingin melihat zmodem.js, silakan melakukannya dan beri tahu saya cara kerjanya untuk Anda.

Addon ZMODEM sekarang digabungkan, FYI.

sistem 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

kenapa file explorer tidak bisa dibuka?
default

Apakah halaman ini membantu?
0 / 5 - 0 peringkat