Xterm.js: ZModem-Unterstützung?

Erstellt am 19. Sept. 2016  ·  41Kommentare  ·  Quelle: xtermjs/xterm.js

ZModem unterstützen, damit wir Dateien mit lrzsz empfangen/senden können? Klingt das interessant?

Hilfreichster Kommentar

Wenn ich meine zwei Cent in Bezug auf die Form hinzufügen darf, um daraus ein xterm-Plugin zu machen: Ich würde vorschlagen, überhaupt keine Benutzeroberfläche hinzuzufügen, sondern Dinge über ein Ereignis zu versenden, ähnlich wie bei Knotenströmen. Etwas wie

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

});

Auf diese Weise kann ein Verbraucher seine eigene Benutzeroberfläche auf dem Plugin aufbauen.

Alle 41 Kommentare

Könnten Sie bitte näher darauf eingehen, wie dies auf xterm.js funktionieren würde?

Ich verwende xterm.js, um eine Verbindung zu einer Bash (einer Bash mit vollem Funktionsumfang) herzustellen und den Benutzer mit der Bash interagieren zu lassen. Ich möchte, dass der Benutzer die Datei über das Webterminal mithilfe von rz/sz hoch-/herunterlädt.

Wenn ich mich mit SecureCRT/Xshell mit der Shell einer Maschine verbinde, kann ich Dateien mit dem Befehl rz / sz hochladen/herunterladen. Ich möchte zterm.js verwenden, um eine Verbindung zur Shell einer Maschine herzustellen und Dateien mit dem Befehl rz / sz hoch- und herunterzuladen

Zmodem ist eine Protokollfunktion der zugrunde liegenden seriellen Leitungsabstraktion des PTY-Systems. Dies ist bereits mit Tools wie zssh in xterm.js nutzbar. xterm.js selbst leitet nur die Master-IO des PTY an den Browser weiter. In Wirklichkeit arbeiten Sie auf dem System, auf dem der Serverteil xterm.js gehostet wird.

Dies unterscheidet sich erheblich von einem Terminalemulator, der auf demselben Computer wie SecureCRT ausgeführt wird.

Die Frage ist also - Von welchem ​​Computer auf welchen Computer möchten Sie Dateien über das Terminal verschieben? (Denken Sie daran, dass Ihr lokaler Computer keinen Terminalkanal zum Serverteil von xterm.js hat).

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

Ich möchte Dateien vom lokalen Computer auf den Remote-Computer verschieben. Auf den Remote-Rechner kann vom lokalen Rechner nicht direkt zugegriffen werden, da er keine externe IP hat.

Denken Sie daran, dass Ihr lokaler Computer keinen Terminalkanal zum Serverteil von xterm.js hat

Gibt es dafür einen Workaround?

Nun, Sie können zssh (mit Zmodem-Unterstützung), sftp oder scp vom Proxy aus verwenden.

Wenn es nicht von jemandem implementiert wird, gibt es keine Möglichkeit, Dateien direkt vom Webterminal in Ihrem Browser auf den Remote-Rechner hoch- oder herunterzuladen. Eines der Modemprotokolle könnte auf diese Weise verwendet werden (es gibt eine XModem JS-Implementierung), aber da der Browser nur sehr begrenzten Zugriff auf das Dateisystem hat, bezweifle ich die Nützlichkeit. Der schwierige Teil wäre, eine Download-Interaktion mit dem Browser für große Dateien bereitzustellen (da die Daten über den Websocket direkt im Browser landen, müsste JS alle Daten halten, bis sie gespeichert werden können.)

Ein anderer Ansatz wäre, den Serverteil mit rz/sz-Funktionalität zu erweitern und diese transparent dem Browser zuzuordnen. Dies würde die FS-Beschränkungen des Browsers umgehen, müsste aber einen anderen Parser in den Terminal-Stream einhängen, um die 'rz\r'-Initialisierung der Modemprotokolle abzufangen.

Ich habe an einer ZMODEM-Implementierung in JavaScript gearbeitet und lasse sie Dateien in beide Richtungen über xterm.js übertragen.

Der Browser muss beim Empfang tatsächlich die gesamte Datei zwischenspeichern. :( Das ist jedoch wirklich der einzige Nachteil, und es ist nicht schlecht, es sei denn, Sie senden sehr große Dateien. Uploads können über FileReader durchgeführt werden, und Downloads erfolgen über das Attribut „download“ von <a> Elementen.

Ich teste und dokumentiere es noch, aber ist die ZMODEM-Integration eine Funktion, die xterm.js interessieren würde?

@FGasper Nice :) Klingt vielversprechend, wenn Sie es mit der Stream-API von Node implementiert haben, könnte es auch für große Dateien als serverseitige Erweiterung nützlich sein, die diese Dateien über einen Download-Link an den Browser-Endpunkt weiterleitet.

Die Bibliothek selbst ist plattformunabhängig und sollte daher überall funktionieren. (Auf Holz klopfen.)

@FGasper klingt ordentlich 😄!

Wir können definitiv ein Zmodem-Addon in Betracht ziehen, wenn es im Browser funktioniert.

Was sind normalerweise die Anwendungsfälle für die Verwendung von Zmodem?

Ich verwende es, um Dateiübertragungen innerhalb einer Terminalsitzung zu/von meiner Workstation durchzuführen. Es erlaubt Ihnen, nicht scp/sftp oder was nicht zu müssen.

Ähnlich wie bei iTerm2:
https://github.com/mmatrac/iterm2-zmodem

@parisk Die X/Y/Z-MODEM-Protokolle ermöglichen es, eine Terminalverbindung für den direkten Dateitransfer von und zur anderen Seite zu "missbrauchen". Dies ist sehr nützlich, wenn Sie einen Server nur über eine einzelne Terminalsitzung orchestrieren möchten. Für POSIX-Systeme gibt es dafür die Tools rz / sz .

Nun, für xterm.js ist es ein perfektes Addon, es wird die Nützlichkeit von xterm.js für Serveradministratoren in eingeschränkten Umgebungen erhöhen. :+1:

NB: XMODEM und YMODEM haben beide den Nachteil, dass sie die andere Seite nicht „auffordern“, dass eine Dateiübertragung bereit ist. (Es ist bedauerlich, weil sie viel einfacher sind!)

ZMODEM sendet im Wesentlichen eine „magische Zeichenfolge“, die beobachtet werden kann; dann fragen Sie den Benutzer: „ZMODEM erkannt; mit der Dateiübertragung fortfahren?“ An diesem Punkt stellt die Implementierung Mittel bereit, um entweder Dateien zum Übertragen bereitzustellen oder Dateien zu akzeptieren/überspringen, wenn der Absender sie anbietet.

Für xterm.js wäre es nett, Dateien einfach per Drag'n Drop in das Terminal zu ziehen - sagen wir, eine Datei wird im aktuellen Terminal-Shell-Pfad gespeichert. Dies ist jedoch sehr schwierig zu bewerkstelligen, es sei denn, xterm.js kann die Remote-Shell selbst steuern oder zumindest das aktuelle Arbeitsverzeichnis jederzeit abrufen. Das gleiche gilt für rückwärts - wenn eine ls Auflistung als Verweis auf entfernte Dateien erkannt werden könnte, wäre Drag'n Drop aus dem Terminal nett. Naja nur träumen :zwinker:

Ich verstehe nicht, warum Drag/Drop von rz nicht möglich wäre, sobald die Zmodem-Sitzung gestartet wurde. Es könnte auf mehrere Arten implementiert werden, aber vielleicht:

1) Geben Sie rz in Ihre Konsole ein.
2) Ziehen Sie Dateien per Drag & Drop.
3) Starten Sie die Übertragung.

Frage: Wie eingestellt ist xterm.js noch auf IE-Unterstützung?

Keine IE-Unterstützung mehr in v3 aufgrund https://github.com/sourcelair/xterm.js/pull/938 , Entwickler sollten sowieso weg sein.

Ich würde euch gerne eine Demo zeigen.

Ich habe gegen meinen eigenen Terminalserver getestet, würde aber gerne alles verwenden, was Sie als Standard haben.

image
^^ Übersehe ich hier etwas? npm install Fehler für mich raus …

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

Vielleicht haben Sie git clone ... vergessen? Und warum mit sudo ?

@FGasper

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

Sie führen npm install in Ihrem Home-Verzeichnis aus, nicht im Repo-Verzeichnis.

Gibt es eine Möglichkeit, node-pty dazu zu bringen, Binärdateien anstelle von Strings auszugeben? ZMODEM ist ein binäres Protokoll, aber die Demo scheint zu glauben, dass alles UTF-8 ist. Insbesondere scheint etwas 0x8a in UTF-8 zu konvertieren \ufffd

Dies könnte etwas komplizierter sein - für eine schnelle Lösung können Sie versuchen, die Encoder von node-pty zu deaktivieren oder den String-Typ auf "binary" zu setzen, aber dies kann unerwünschte Auswirkungen auf die Websocket-Übertragung an xterm.js haben. Soweit ich das beurteilen kann, basiert die gesamte Kette node-pty <---> websocket <---> xterm.js auf UTF-8-Bytes, die im laufenden Betrieb in JS-Strings dekodiert werden. Möglicherweise benötigen Sie einen größeren Patch, um Binärdaten fließen zu lassen.

Wo ist diese Einstellung binary Zeichenfolgentyp

Soweit ich das beurteilen kann, sind die Daten bereits beschädigt, wenn sie app.js , sodass die Verhaltensänderung in node-pty erfolgen muss.

ZMODEM schreibt zwar eine Codierung vor, die alle High-Bit-Zeichen bis auf 7-Bit maskiert, aber es wurde anscheinend nie wirklich implementiert … Forsberg dachte wahrscheinlich, dass es nie benötigt werden würde, da alle Zeilen 8-Bit-sicher wurden, heh. :)

Sie können es mit {encoding: 'binary'} in den Ctor-Optionen oder .setEncoding('binary') im laufenden Betrieb versuchen.

Es sieht so aus, als ob das neueste node-pty das Einstellen oder Nicht-Setzen des UTF8-Modus ermöglicht …

  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 … der von xterm.js gezogene node-pty (0.4.1) ist ziemlich alt … vielleicht würde die neueste Version dieses Flag enthalten.

Der Aufruf von .setEncoding('binary') funktioniert nicht … und auch die Übergabe von encoding:"binary" an pty.spawn().

IUTF8 von termios macht eine andere Sache - es ermöglicht die korrekte Behandlung von Multi-Byte-UTF8-Zeichen im pty-Gerät (für Linienbreite und Löschen).
Hmm vielleicht auf die harte Tour - versuche den Encoder zu entfernen:

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

Dies sollte Ihnen Pufferobjekte anstelle von Strings geben (höchstwahrscheinlich nach oben in xterm.js umbrechen).

OK, ich habe es bekommen, indem ich auf node-pty 0.6.4 aktualisiert und die Codierung auf null . (Brauchte das _readableState Zeug nicht.) Es sendet immer noch die erste Zeile der Shell-Sitzung als Text, aber alles danach ist binär, also cool.

Es sendet immer noch die erste Zeile der Shell-Sitzung als Text ...

Selbst wenn Sie es als {encoding: null} auf den Konstruktor anwenden?

Ja, auch bei {encoding: null} die erste Zeile als Textrahmen gesendet.

Ich habe das in einen meiner Meinung nach vernünftigen Zustand gebracht, um es auszuprobieren.

1) Richten Sie https://github.com/FGasper/xterm.js.git als Fernbedienung ein.
2) Sehen Sie sich den zmodem Zweig dieses Repos an.
3) git submodule init; git submodule update
4) npm install (Siehe unten.)
5) npm start , dann localhost:3000 in den Browser laden. (Chrom habe ich getestet.)
6) ssh zu einer Maschine, auf der lrzsz installiert ist.
7) Geben Sie rz und senden Sie eine oder mehrere Dateien von Ihrer Workstation an die Fernbedienung.
8) sz <filename1> <filename2> … sendet Dateien in einem Stapel an Ihre Workstation.

(Die Benutzeroberfläche ist vom Design her minimalistisch; vermutlich würde eine „echte“ Bereitstellung sie mehr aufpolieren.)

Zu Schritt 4: Als ich gerade auf meiner Workstation getestet habe, musste ich ein Berechtigungsproblem mit dem node-gyp Paket beheben.

Schön, funktioniert wie ein Zauber (getestet mit Textdateien in Firefox).

Nur ein paar Anmerkungen:

  • Kann die Init-Sequenz versehentlich ausgelöst werden (zB zufällige Datenausgabe)? Wenn ja, würde das Terminal IMHO eine Einstellung "Dateiübertragung eingeben" benötigen, um dies explizit zu machen.
  • Die "ZMODEM-Sitzung starten" sollte unterbrechbar sein, die Auswahl von "Nein" bricht rz am anderen Ende nicht ab.
  • Ist es möglich, während der Übertragung einen Fortschrittsbalken / eine Fortschrittsanzeige in das Terminal-Widget einzuzeichnen? Oder etwas anderes ausgefalleneres Zeug, atm rz/sz druckt einige seltsame Statusnummern in das Terminal.

@jerch

1) Ja, es ist möglich, die Init-Sequenz versehentlich auszulösen. Dafür ist die Aufforderung „ZMODEM-Sitzung starten“ gedacht: Der Benutzer kann sich bei Bedarf immer noch zurückziehen.

2) Sollte jetzt behoben sein.

3) Die Anwendung empfängt progress Ereignisse synchron mit der FileReader-API des Browsers. Chrome scheint Inhalte mit progress ; Firefox gibt den Dateiinhalt in diesen Ereignissen jedoch nicht an. Wenn Sie sich in Chrome eine entsprechend große Datei senden, sehen Sie Folgendes:
image

4) Die seltsamen Zeichen zu Beginn einer Sitzung sind die druckbaren Teile der ZMODEM-Empfangs-Init-Sequenz: ** + ASCII CAN + B01 + 10 Hex-Zeichen + CR + 0x8a + XON. Ich stimme zu, dass es hässlich ist, dass sie auf den Bildschirm gehen; Es ist jedoch ziemlich Standard in ZMODEM-versierten Terminals, die ich verwendet habe. Ich nehme an, es könnte genug BS-Zeichen an das Terminal senden, um diese Zeichen zu löschen?

Außerdem muss ein Steuerelement hinzugefügt werden, um eine laufende Übertragung abzubrechen. Ich überlege noch, wie ich das am besten handhabe.

Außerdem muss ein Steuerelement hinzugefügt werden, um eine laufende Übertragung abzubrechen. Ich überlege noch, wie ich das am besten handhabe.

Vielleicht hilft das aus den Spezifikationen?

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

Möglicherweise. Die Spezifikation ist nicht immer die hilfreichste Sache; zum Beispiel erwähnt es eine Attn-Sequenz, die nach einem ZSINIT gesendet wird. Die Spezifikation scheint darauf hinzudeuten, dass ein Absender auf diese Weise dazu gebracht wird, einen Datenversand zu unterbrechen, aber anscheinend verwendet nichts Attn. Ebenso bei der Option ESC8: Sie ist nicht wirklich in lrzsz implementiert, und da dies die De-facto-Referenzimplementierung ist, ist ESC8 unbrauchbar – was schade ist, da es dieses Problem mit dem termios-IEXTEN-Flag gut umgehen würde.

Ich bin gerade bei anderen Projekten in einer Zeitnot, aber ich hoffe, dass ich nächste Woche darauf zurückkommen kann.

Wenn ich meine zwei Cent in Bezug auf die Form hinzufügen darf, um daraus ein xterm-Plugin zu machen: Ich würde vorschlagen, überhaupt keine Benutzeroberfläche hinzuzufügen, sondern Dinge über ein Ereignis zu versenden, ähnlich wie bei Knotenströmen. Etwas wie

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

});

Auf diese Weise kann ein Verbraucher seine eigene Benutzeroberfläche auf dem Plugin aufbauen.

@mofux So möchte ich auch, dass das funktioniert. Die UI-Komponenten, die ich in die Demo eingefügt habe, sollen nur die Steuerelemente demonstrieren.

@FGasper Gute Arbeit

Ich werde ZModem-Unterstützung für ttyd hinzufügen, wenn Ihre API einsatzbereit ist (https://github.com/tsl0922/ttyd/issues/37), danke für Ihre Arbeit.

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

Ich habe eine ALPHA-Version von zmodem.js erstellt. Von hier aus werde ich mir die Plugin-Schnittstelle für xterm.js ansehen, aber jeder, der sich zmodem.js ansehen möchte, kann dies gerne tun und mir mitteilen, wie es für Sie funktioniert.

Das ZMODEM-Addon ist jetzt zusammengeführt, FYI.

win7-system

$ 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

Warum kann der Datei-Explorer nicht geöffnet werden?
default

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen