Xterm.js: Поддержка ZModem?

Созданный на 19 сент. 2016  ·  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 из прокси.

Если кто-то не реализует это, нет возможности загружать / загружать файлы прямо с веб-терминала в вашем браузере на удаленный компьютер. Таким образом можно было бы использовать один из протоколов модема (есть реализация XModem JS), но, поскольку браузер имеет очень ограниченный доступ к файловой системе, я сомневаюсь в полезности. Сложнее всего было бы обеспечить взаимодействие загрузки с браузером для больших файлов (поскольку данные поступают непосредственно в браузер через веб-сокет, JS должен будет хранить все данные, пока они не будут сохранены).

Другой подход - расширить серверную часть функциональностью rz / sz и прозрачно отобразить ее в браузере. Это позволит обойти ограничения FS браузера, но потребует подключения другого парсера к потоку терминала, чтобы поймать инициализацию 'rz \ r' протоколов модема.

Я работал над реализацией ZMODEM в JavaScript и передавал файлы в обоих направлениях через xterm.js.

Браузер действительно должен буферизовать весь файл при получении. :( Это действительно единственный недостаток, и это неплохо, если вы не отправляете очень большие файлы. Загрузку можно выполнять через FileReader, а загрузка происходит через атрибут «download» элементов <a> .

Я все еще тестирую и документирую его, но интересует ли интеграция ZMODEM xterm.js?

@FGasper Nice :) Звучит многообещающе, если вы реализуете его с помощью API потока узла, это также может быть полезно для больших файлов в качестве расширения на стороне сервера, которое проксирует эти файлы в конечную точку браузера через ссылку для загрузки.

Сама библиотека не зависит от платформы, поэтому должна работать где угодно. (Стучать по дереву.)

@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:

NB: XMODEM и YMODEM имеют недостаток, заключающийся в том, что они не «подсказывают» другой стороне, что передача файла готова. (К сожалению, они намного проще!)

ZMODEM отправляет то, что по сути является «волшебной цепочкой», за которой можно наблюдать; затем вы спрашиваете пользователя: «Обнаружен ZMODEM; продолжить передачу файла? » На этом этапе реализация предоставляет средства либо для предоставления файлов для передачи, либо для приема / пропуска файлов по мере их предложения отправителем.

Для xterm.js было бы неплохо просто перетащить файлы в терминал - допустим, файл сохраняется по текущему пути оболочки терминала. Но это очень сложно сделать, если xterm.js не может управлять самой удаленной оболочкой или хотя бы захватывать текущий рабочий каталог в любой момент. То же самое и в обратном направлении - если список ls может быть замечен как относящийся к удаленным файлам, перетаскивание из терминала было бы аккуратным. Ну просто мечтаю

Я не понимаю, почему перетаскивание rz невозможно после запуска сеанса Zmodem. Это может быть реализовано несколькими способами, но возможно:

1) Введите в консоль rz .
2) Перетащите файлы внутрь.
3) Запустите перенос.

Вопрос: Как установлена ​​поддержка xterm.js в IE?

Больше нет поддержки IE в v3 из-за 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 ?

@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 или установить тип строки на «двоичный», но это может оказать нежелательное влияние на передачу веб-сокета в xterm.js. Насколько я могу судить, вся цепочка node-pty <---> websocket <---> xterm.js полагается на байты UTF-8, которые на лету декодируются в строки JS. Может потребоваться более крупный патч для передачи двоичных данных.

Где этот параметр типа binary ? (Я не вижу такого в node-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

Хм ... узел-pty, который 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 .) Он по-прежнему отправляет первую строку сеанса оболочки в виде текста, но все, что находится после, является двоичным, так что круто.

Он по-прежнему отправляет первую строку сеанса оболочки в виде текста ...

Даже если вы примените его к конструктору как {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).

Несколько замечаний:

  • Можно ли случайно запустить последовательность инициализации (например, случайный вывод данных)? Если это так, то терминалу, IMHO, потребуется настройка «ввести передачу файлов», чтобы сделать это явным.
  • «Начать сеанс ZMODEM» должен быть прерываемым, выбор «Нет» не прерывает rz на другом конце банкомата.
  • Можно ли нарисовать индикатор выполнения в виджете терминала во время передачи? Или еще что-нибудь, atm rz/sz выводит в терминал какие-то странные номера состояний.

@jerch

1) Да, последовательность инициализации может быть запущена случайно. Для этого и предназначена подсказка «Начать сеанс ZMODEM»: при необходимости пользователь может вернуться назад.

2) Исправить сейчас.

3) Приложение получает события progress синхронно с FileReader API браузера. Кажется, что Chrome передает контент с помощью progress ; однако Firefox фактически не передает содержимое файла в этих событиях. Если вы отправите себе в Chrome файл подходящего размера, вы увидите что-то вроде:
image

4) Странные символы в начале сеанса - это печатаемые части последовательности приема-инициализации ZMODEM: ** + ASCII CAN + B01 + 10 шестнадцатеричных символов + CR + 0x8a + XON. Я согласен, что это некрасиво, что они идут на экран; тем не менее, это довольно стандартно для терминалов ZMODEM, которые я использовал. Я полагаю, он может отправить на терминал достаточно символов 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 Вот как я бы тоже хотел, чтобы это работало. Компоненты пользовательского интерфейса, которые я поместил в демонстрацию, предназначены только для демонстрации элементов управления.

@FGasper Хорошая работа 👍

Я собираюсь добавить поддержку ZModem для ttyd, когда ваш api будет готов к использованию (https://github.com/tsl0922/ttyd/issues/37), спасибо за вашу работу.

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 рейтинги