Как получить файл на хост, когда у вас есть только последовательная консоль?

21

Когда у вас есть только последовательная консоль (скажем, через telnet через сервер терминалов), какие методы можно использовать для передачи файлов в / из хоста?

Вырезание / вставка работает для мелкого / печатаемого материала, и я играл с комбинацией uuencode / uudecode (с gzip), обрабатывающей непечатаемый текст, но все это очень ограничивает.

Стивен Пол Лесневски
источник
Учитывая некоторые комментарии, которые вы оставили о доступности утилит, было бы полезно, если бы вы могли назвать платформу и / или описать среду, в которой вы находитесь. В противном случае вы получите исходный Kermit / XMODEM / YMODEM / ZMODEMk через терминальные ответы ...
Avery Payne
Я провожу большую часть своего дня за солярисом. Таким образом, если бы у вас был только SUNCreq (или, возможно, SUNWCuser), что бы вы ответили?
Стивен Пол Лесневски
всего через 5 лет: P Теперь вы можете принять мой ответ, потому что это было именно то, что вы хотели ... но, вероятно, не нужно сегодня.
Дж. М. Беккер

Ответы:

13

Программы последовательной консоли¹, которые вы будете использовать на другом конце соединения, будут каким-то образом отправлять файл на удаленную сторону. Как именно вы это сделаете, зависит от того, какие ресурсы у вас есть в удаленной системе.

У меня есть lrzszили kermitна удаленной стороне

Самый простой случай - если у вас установлена ​​удаленная двоичная программа для передачи файлов, например, lrzszили kermit. Это было когда-то более распространено, чем сегодня, но ваша конкретная система может все еще иметь один из них.

Программа последовательной консоли, которую вы используете на локальной стороне, почти наверняка имеет способ сделать загрузку Zmodem или Kermit, которая позволяет вам отправлять все, что вам нужно напрямую.

В случае Zmodem просто введите rzна удаленной системе, которая отправляет специальную строку, которую должен понимать локальный последовательный терминал, вызывая его всплывающее диалоговое окно выбора файлов.

Kermit - более простой протокол, поэтому в этом случае вы должны начать передачу вручную.

У меня нет программы передачи двоичных файлов, но у меня есть uuencode/base64

Использование правильной программы передачи двоичных файлов имеет несколько преимуществ, таких как lrzszили kermit: эффективность, проверка контрольных сумм, автоматические повторные попытки, возобновление отмененной передачи, многократная передача файлов и т. Д., Но это роскошь . Если вам нужно отправить только один файл, или вы отправляете файлы редко, вы можете избежать загрузки ASCII.

Поскольку терминальные протоколы интерпретируют многие байтовые значения, встречающиеся в двоичном файле данных, вы не можете отправить файл напрямую через одно и то же соединение; если вы это сделаете, код эмуляции терминала на любом конце попытается интерпретировать некоторые данные, повредить данные и, вероятно, также запутать код обработки терминала.

Вы можете обойти это, кодируя двоичные данные в безопасное подмножество ASCII на локальной стороне, а затем превращая их обратно в необработанные двоичные данные на удаленной стороне. Это то , что uuencodeи base64программы делают, отличаясь лишь в незначительном выборе алгоритма.

В локальной системе вы кодируете файл: ²

$ uuencode -o sbf.uue some-binary-file.gz some-binary-file.gz

Затем вы вводите эту команду в удаленной системе и отправляете файл с помощью функции «ASCII upload» локальной последовательной консоли:

$ cat | uudecode

Когда загрузка файла завершится, нажмите, Ctrl-Cчтобы выйти cat. Теперь у вас есть декодированный файл в удаленной системе, как вы и хотели.

Но у меня много файлов для отправки, и перекодировка в ASCII для печати - это боль!

Нетрудно загрузить себя на более высокий уровень технологий. Если в удаленной системе есть компилятор C, вы можете использовать предыдущую технику для отправки удаленной системе копии lrzszисходного кода. На местной стороне:

$ uuencode -o lrzsz.tgz.uue lrzsz-0.12.20.tar.gz lrzsz-0.12.20.tar.gz

Затем в удаленной системе введите это через программу последовательной консоли:

$ cat | uudecode
^C
$ tar xvf lrzsz-0.12.20.tar.gz
...build lrzsz normally

После запуска первой команды выполните «ASCII-загрузку» lrzsz.tgz.uueфайла в удаленную систему. Конвейер принимает данные в кодировке uuenco и декодирует их в двоичный архив, который вы можете распаковать и собрать.

Но у меня нет компилятора C в удаленной системе

Если вы даже не компилятор на удаленной системе, вы можете пересечь скомпилировать в rzпрограмму (или любой другой ) на локальной системе и отправить его на удаленной системе , используя описанную выше технику.


Примечания:

  1. Миником , picocom , PuTTY , VanDyke CRT ...

  2. Вы должны uuencodeдважды указать имя входного файла для этой версии , один раз, чтобы указать источник входных данных, и снова объявить, как удаленная система должна вызывать файл, когда она декодирует данные в выходной файл. Можно предположить, что удаленная система должна иметь другое имя для своего выходного файла.

    Ваша локальная версия uuencodeможет вести себя по-другому.

Уоррен Янг
источник
Фантастически, я надеялся, что у этого вопроса был ответ, упоминающий кермит! +1;)
Тим
Это хороший ответ, мне нравится раздел "Но у меня нет". К сожалению, это останавливается на довольно популярном материале и не идет очень глубоко. Кто-нибудь создает двоичные исполняемые файлы для разных архитектур только из кодов ASCII? Вот для начальной загрузки: retrocomputing.stackexchange.com/questions/4672/...
pfalcon
5

В основном, вы должны использовать преинтернетные методы для передачи через серийный tty, и у вас должен быть способ получить передачу на другой стороне. Очевидно, что лучший способ сделать это - использовать ZMODEM, а это значит, что вам нужен инструмент, подобный szуже полученному. Однако это не всегда возможно, например, когда целью получения является маршрутизатор без сети.

Единственный возможный способ сделать эту передачу - это напрямую по каналу, используя терминал ASCII, в чистом пред-8-битном стиле. Я собираюсь использовать более современные инструменты, которые, я надеюсь, установлены на большинстве систем.

Отправитель:

Сначала мы кодируем наш файл

base64 file.tar.gz > file.tar.gz.b64

Теперь убедитесь, что ваша команда com send-file, ascii-xfrэто была моя командная строка подключения

picocom -f n -p n -d 8 -b 115200  --send-cmd "ascii-xfr -snv" /dev/ttyS0

Обычно мы хотим ascii-xfrна принимающей стороне, но так как у нас его нет, это обходится -n, поддерживая правильные окончания строк.

Приемник:

Теперь, когда мы подключились, перейдите в каталог, где вы хотите получить полученный файл.

cd /tmp/
cat > file.tar.gz.b64

На picocom я просто нажимаю CTRL + a + s и ввожу полный путь к файлу, который отправляю. Как только передача завершится, вам нужно нажать CTRL + c, чтобы прервать это cat.

Теперь мы декодируем файл,

base64 -d file.tar.gz.b64 > file.tar.gz

Сделайте все возможное, чтобы убедиться, что файл ИДЕНТИЧНЫЙ для того, который вы отправили, потому что передача ASCII не имеет защиты контрольной суммы. У моего получающего ящика была sha512sum, но любой команды контрольной суммы было бы достаточно. Как только вы вручную подтвердите совпадение сумм, вы можете предположить, что перевод прошел успешно!

Дж. М. Беккер
источник
(И два года спустя ...) в моем опыте, связанном с передачей файлов по системам, которые разбивают окончания строк (спасибо Microsoft!), Кодирование / декодирование base64 не заботит стиль окончания строк. \r\nили просто \nоба работают, даже если они "исправлены" по пути. Я не припомню, если это в стандарте base64 или просто в инструментах, которые я использовал, но я подозреваю, что на самом деле это стандартное поведение.
Эндрю Хенле
5

Может быть, вы должны попробовать Minicom .

Elmarco
источник
Разве для этого не требуется что-то вроде 'sx' или 'sz' на исходном хосте?
Стивен Пол Лесневски
4
Нет, minicom обрабатывает свои собственные файлы xfers. sx, sy, sz и rx, ry, rz - это отдельные программы, обычно находящиеся в пакетах с удачным названием lszrz или что-то в этом роде. Хотя я бы предложил использовать sz и rz. Маленький, простой, и он делает то, что делает. Minicom - это целый эмулятор терминала.
Райх
4
Этот ответ не правильный. Minicom порождает lrzsz для передачи файлов. Minicom не может и не обрабатывает свои собственные передачи файлов.
Джонатан Клайн IEEE
5

Не знаю, сработает ли это, если бы у вас была только последовательная консоль, но если у вас вообще есть доступ к сети, вы можете использовать ее nc(1)для копирования файлов с использованием TCP / IP.

# WARNING: Depending on your setup, this could make your system unbootable
root@destination-box.local # nc -l 8675 | dd of=/dev/sdXXX
root@source-box.local # dd if=/dev/sdYYY | nc destination-box.local 8675

В приведенном выше примере я клонировал sdbYYYиз поля источника в поле sdaXXXназначения. Мой выбор 8675 для номера порта TCP был произвольным; Вы можете использовать любой порт, к которому у вас есть доступ. И это не должно быть устройство; это может быть любой файл.

kevin@destination-box.local $ nc -l 12345 >> ~/.ssh/authorized_keys
kevin@source-box.local $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345

Во втором примере я скопировал свой открытый ключ rsa ( ~/.ssh/id_rsa.pub) и добавил его в файл авторизованных ключей для целевого хоста.

Кевин М
источник
5
Могу я предложить большой красный предупреждающий знак над вашей первой идеей? Какая-то одинокая душа с умом учиться может выполнить что-то подобное в надежде скопировать только файлы, не читая, конечно, сначала следующий абзац :)
reiche
2

Я бы использовал kermit , прародителя программ передачи файлов. Мы использовали это уже задолго до того, как появился Linux.

txwikinger
источник
ах да .. я помню, что делал, но в этом случае kermit не устанавливается на исходный хост.
Стивен Пол Лесневски