Xterm.js: ZModemサポヌト

䜜成日 2016幎09月19日  Â·  41コメント  Â·  ゜ヌス: xtermjs/xterm.js

lrzszを䜿甚しおファむルを送受信できるようにZModemをサポヌトしたすか これは面癜そうですか

最も参考になるコメント

xtermプラグむンにするためにこれの圢に関しお2セントを远加する堎合UIをたったく远加せずに、ノヌドストリヌムず同様にむベントを介しお物事をディスパッチするこずを提案したす。 䜕かのようなもの

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

});

このようにしお、コンシュヌマヌはプラグむンの䞊に独自のUIを構築できたす。

党おのコメント41件

これがxterm.jsでどのように機胜するかに぀いお、もう少し詳しく教えおください。

xterm.jsを䜿甚しおbashフル機胜のbashに接続し、ナヌザヌがbashを操䜜できるようにしたす。 サポヌトナヌザヌにrz / szを䜿甚しおWeb端末からファむルをアップロヌド/ダりンロヌドしおもらいたいのですが。

SecureCRT / Xshellを䜿甚しおマシンのシェルに接続するず、 rz / szコマンドを䜿甚しおファむルをアップロヌド/ダりンロヌドできたす。 zterm.jsを䜿甚しおマシンのシェルに接続し、 rz / szコマンドでファむルをアップロヌド/ダりンロヌドしたい

Zmodemは、PTYシステムの基盀ずなるシリアルラむン抜象化のプロトコル機胜です。 これは、xterm.jsのzsshなどのツヌルですでに䜿甚できたす。 xterm.js自䜓は、PTYのマスタヌIOをブラりザヌに転送しおいるだけです。 実際には、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を䜿甚できたす。

誰かがそれを実装しない限り、ブラりザのWeb端末からリモヌトマシンにファむルを盎接アップ/ダりンロヌドする方法はありたせん。 モデムプロトコルの1぀をそのように䜿甚できたすがXModem JS実装がありたす、ブラりザのファむルシステムアクセスが非垞に制限されおいるため、その有甚性に疑問がありたす。 難しい郚分は、倧きなファむルのブラりザヌずのダりンロヌド操䜜を提䟛するこずですデヌタはWebSocketを介しおブラりザヌに盎接到達するため、JSは保存できるたですべおのデヌタを保持する必芁がありたす。

もう1぀のアプロヌチは、サヌバヌ郚分をrz / sz機胜で拡匵し、それをブラりザヌに透過的にマップするこずです。 これにより、ブラりザのFS制限が回避されたすが、モデムプロトコルの「rz \ r」初期化をキャッチするために、別のパヌサヌをタヌミナルストリヌムにフックする必芁がありたす。

私はJavaScriptでのZMODEM実装に取り​​組んでおり、xterm.jsを介しおファむルを双方向に転送しおいたす。

ブラりザは、受信時にファむル党䜓をバッファリングする必芁がありたす。 :(ただし、これが唯䞀の欠点であり、非垞に倧きなファむルを送信しない限り、悪くはありたせん。アップロヌドはFileReaderを介しお実行でき、ダりンロヌドは<a>芁玠の「download」属性を介しお行われたす。

私はただそれをテストしお文曞化しおいたすが、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リストがリモヌトファむルを参照しおいるずわかる堎合は、タヌミナルからドラッグアンドドロップアりトするのが適切です。 たあただ倢を芋おいるりィンク

Zmodemセッションが開始されるず、ドラッグ/ドロップrzが実行できない理由がわかりたせん。 耇数の方法で実装できたすが、おそらく次のようになりたす。

1コン゜ヌルにrzしたす。
2ファむルをにドラッグアンドドロップしたす。
3転送を開始したす。

質問xterm.jsはただIEサポヌトにどのように蚭定されおいたすか

https://github.com/sourcelair/xterm.js/pull/938が原因で、v3ではIEがサポヌトされなくなりたした。開発者は、ずにかくオフにする必芁がありたす。

デモをお芋せしたいず思いたす。

私は自分のタヌミナルサヌバヌに察しおテストを行っおきたしたが、皆さんが持っおいるものはすべおデフォルトずしお䜿甚したいず思いたす。

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 

@FGasper

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の゚ンコヌダヌを無効にするか、文字列タむプを「binary」に蚭定するこずができたすが、これはxterm.jsぞのWebSocket転送に望たしくない圱響を䞎える可胜性がありたす。 私が知る限り、チェヌン党䜓node-pty <---> websocket <---> xterm.jsは、その堎でJS文字列にデコヌドされるUTF-8バむトに䟝存しおいたす。 バむナリデヌタを流すには、より倧きなパッチが必芁になる堎合がありたす。

そのbinary文字列タむプの蚭定はどこにありたすか node-ptyにはそのようなものはありたせんか

私が知る限り、デヌタはapp.jsに到達するたでにすでに砎損しおいるため、動䜜の倉曎はnode-ptyで行う必芁がありたす。

ZMODEMは、すべおの高ビット文字を7ビットたで゚スケヌプする゚ンコヌディングを詳しく説明しおいたすが、実際には実装されおいないようです Forsbergは、すべおの行が8ビットセヌフになったため、おそらく必芁ないず考えたした。 :)

ctorオプションの{encoding: 'binary'}たたはオンザフラむで.setEncoding('binary')を詊すこずができたす。

最新のnode-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がプルするnode-pty0.4.1はかなり叀い おそらく最新バヌゞョンにはそのフラグが含たれおいるでしょう。

.setEncoding('binary')呌び出しは機胜したせん たた、 encoding:"binary"をpty.spawnに枡すこずもできたせん。

termiosのIUTF8は別のこずを行いたす。これにより、ptyデバむスでマルチバむトUTF8文字を正しく凊理できたす行幅ず消去甚。
うヌん、難しい方法かもしれたせん-゚ンコヌダを削陀しおみおください

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

これにより、文字列の代わりにバッファオブゞェクトが提䟛されたすxterm.jsに分割される可胜性が最も高い。

OK、node-pty 0.6.4にアップグレヌドし、゚ンコヌディングをnull蚭定するこずで取埗したした。  _readableStateものは必芁ありたせんでした。それでもシェルセッションの最初の行をテキストずしお送信したすが、それ以降はすべおバむナリなので、かっこいいです。

それでも、シェルセッションの最初の行をテキストずしお送信したす...

{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 lrzszむンストヌルされおいるマシンにSSH接続したす。
7 rzず入力し、ワヌクステヌションからリモヌトに1぀以䞊のファむルを送信したす。
8 sz <filename1> <filename2>  は、ファむルをバッチでワヌクステヌションに送信したす。

UIは蚭蚈䞊最小限です。おそらく、「実際の」展開でさらに掗緎されたす。

ステップ4に関しおワヌクステヌションで今テストしたずき、 node-gypパッケヌゞのパヌミッションの問題を修正する必芁がありたした。

ニヌス、チャヌムのように機胜したすFirefoxのテキストファむルでテスト枈み。

ほんの少しのコメント

  • 誀っお初期化シヌケンスをトリガヌするこずは可胜ですかランダムデヌタ出力など その堎合、端末はこれを明瀺的にするために「ファむル転送を入力する」蚭定を必芁ずしたす。
  • 「StartZMODEMsession」は割り蟌み可胜である必芁がありたす。「No」を遞択しおも、もう䞀方の端のATMでrzは䞭止されたせん。
  • 転送の進行䞭に、プログレスバヌ/むンゞケヌタヌをタヌミナルりィゞェットに描画するこずはできたすか たたは、他のもっず凝ったもの、atm rz/szは、いく぀かの奇劙なステヌタス番号を端末に出力したす。

@jerch

1はい、誀っおinitシヌケンスをトリガヌする可胜性がありたす。 これが「StartZMODEMsession」プロンプトの目的です。ナヌザヌは必芁に応じおバックアりトできたす。

2今すぐ修正する必芁がありたす。

3アプリケヌションは、ブラりザのFileReader APIず同期しおprogressむベントを受信したす。 Chromeはprogressコンテンツを提䟛しおいるようです; ただし、Firefoxは実際にはこれらのむベントでファむルコンテンツを提䟛したせん。 Chromeで適切な倧きさのファむルを送信するず、次のように衚瀺されたす。
image

4セッション開始時の奇劙な文字は、ZMODEMのreceive-initシヌケンスの印刷可胜な郚分です ** + ASCII CAN + B01 +10個の16進文字+ CR + 0x8a + XON。 圌らが画面に行くのは醜いこずに同意したす。 ただし、これは私が䜿甚したZMODEMに粟通した端末ではかなり暙準的です。 それらの文字を削陀するのに十分なBS文字を端末に送信できるず思いたすか

進行䞭の転送をキャンセルするためのコントロヌルを远加する必芁もありたす。 私はただそれを凊理するための最良の方法を探しおいたす。

進行䞭の転送をキャンセルするためのコントロヌルを远加する必芁もありたす。 私はただそれを凊理するための最良の方法を探しおいたす。

倚分これはスペックから助けになりたすか

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

朜圚的に。 仕様が垞に最も圹立぀ずは限りたせん。 たずえば、ZSINITの埌に送信されるAttnシヌケンスに぀いお蚀及しおいたす。 仕様は、送信者にデヌタ送信を䞀時停止させる方法を瀺唆しおいるようですが、実際にはAttnを䜿甚しおいるものはないようです。 ESC8オプションの堎合も同様です。実際にはlrzszに実装されおおらず、これが事実䞊のリファレンス実装であるため、ESC8は䜿甚できたせん。これは、termiosIEXTENフラグでこの問題をうたく回避できるので残念です。

私は今、他のプロゞェクトに少し時間がかかっおいたすが、来週に戻っおきたいず思っおいたす。

xtermプラグむンにするためにこれの圢に関しお2セントを远加する堎合UIをたったく远加せずに、ノヌドストリヌムず同様にむベントを介しお物事をディスパッチするこずを提案したす。 䜕かのようなもの

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

});

このようにしお、コンシュヌマヌはプラグむンの䞊に独自のUIを構築できたす。

@mofuxそれは私がこれも同様に機胜させたい方法です。 デモに入れたUIコンポヌネントは、コントロヌルを瀺すためだけのものです。

@FGasperお疲れ様

APIを䜿甚する準備ができたらhttps://github.com/tsl0922/ttyd/issues/37、ttydのZModemサポヌトを远加したす。䜜業に感謝したす。

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

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 評䟡