Когда у вас есть только последовательная консоль (скажем, через telnet через сервер терминалов), какие методы можно использовать для передачи файлов в / из хоста?
Вырезание / вставка работает для мелкого / печатаемого материала, и я играл с комбинацией uuencode / uudecode (с gzip), обрабатывающей непечатаемый текст, но все это очень ограничивает.
solaris
console
serial-console
Стивен Пол Лесневски
источник
источник
Ответы:
Программы последовательной консоли¹, которые вы будете использовать на другом конце соединения, будут каким-то образом отправлять файл на удаленную сторону. Как именно вы это сделаете, зависит от того, какие ресурсы у вас есть в удаленной системе.
У меня есть
lrzsz
илиkermit
на удаленной сторонеСамый простой случай - если у вас установлена удаленная двоичная программа для передачи файлов, например,
lrzsz
илиkermit
. Это было когда-то более распространено, чем сегодня, но ваша конкретная система может все еще иметь один из них.Программа последовательной консоли, которую вы используете на локальной стороне, почти наверняка имеет способ сделать загрузку Zmodem или Kermit, которая позволяет вам отправлять все, что вам нужно напрямую.
В случае Zmodem просто введите
rz
на удаленной системе, которая отправляет специальную строку, которую должен понимать локальный последовательный терминал, вызывая его всплывающее диалоговое окно выбора файлов.Kermit - более простой протокол, поэтому в этом случае вы должны начать передачу вручную.
У меня нет программы передачи двоичных файлов, но у меня есть
uuencode
/base64
Использование правильной программы передачи двоичных файлов имеет несколько преимуществ, таких как
lrzsz
илиkermit
: эффективность, проверка контрольных сумм, автоматические повторные попытки, возобновление отмененной передачи, многократная передача файлов и т. Д., Но это роскошь . Если вам нужно отправить только один файл, или вы отправляете файлы редко, вы можете избежать загрузки ASCII.Поскольку терминальные протоколы интерпретируют многие байтовые значения, встречающиеся в двоичном файле данных, вы не можете отправить файл напрямую через одно и то же соединение; если вы это сделаете, код эмуляции терминала на любом конце попытается интерпретировать некоторые данные, повредить данные и, вероятно, также запутать код обработки терминала.
Вы можете обойти это, кодируя двоичные данные в безопасное подмножество ASCII на локальной стороне, а затем превращая их обратно в необработанные двоичные данные на удаленной стороне. Это то , что
uuencode
иbase64
программы делают, отличаясь лишь в незначительном выборе алгоритма.В локальной системе вы кодируете файл: ²
Затем вы вводите эту команду в удаленной системе и отправляете файл с помощью функции «ASCII upload» локальной последовательной консоли:
Когда загрузка файла завершится, нажмите, Ctrl-Cчтобы выйти
cat
. Теперь у вас есть декодированный файл в удаленной системе, как вы и хотели.Но у меня много файлов для отправки, и перекодировка в ASCII для печати - это боль!
Нетрудно загрузить себя на более высокий уровень технологий. Если в удаленной системе есть компилятор C, вы можете использовать предыдущую технику для отправки удаленной системе копии
lrzsz
исходного кода. На местной стороне:Затем в удаленной системе введите это через программу последовательной консоли:
После запуска первой команды выполните «ASCII-загрузку»
lrzsz.tgz.uue
файла в удаленную систему. Конвейер принимает данные в кодировке uuenco и декодирует их в двоичный архив, который вы можете распаковать и собрать.Но у меня нет компилятора C в удаленной системе
Если вы даже не компилятор на удаленной системе, вы можете пересечь скомпилировать в
rz
программу (или любой другой ) на локальной системе и отправить его на удаленной системе , используя описанную выше технику.Примечания:
Миником , picocom , PuTTY , VanDyke CRT ...
Вы должны
uuencode
дважды указать имя входного файла для этой версии , один раз, чтобы указать источник входных данных, и снова объявить, как удаленная система должна вызывать файл, когда она декодирует данные в выходной файл. Можно предположить, что удаленная система должна иметь другое имя для своего выходного файла.Ваша локальная версия
uuencode
может вести себя по-другому.источник
В основном, вы должны использовать преинтернетные методы для передачи через серийный tty, и у вас должен быть способ получить передачу на другой стороне. Очевидно, что лучший способ сделать это - использовать ZMODEM, а это значит, что вам нужен инструмент, подобный
sz
уже полученному. Однако это не всегда возможно, например, когда целью получения является маршрутизатор без сети.Единственный возможный способ сделать эту передачу - это напрямую по каналу, используя терминал ASCII, в чистом пред-8-битном стиле. Я собираюсь использовать более современные инструменты, которые, я надеюсь, установлены на большинстве систем.
Отправитель:
Сначала мы кодируем наш файл
Теперь убедитесь, что ваша команда com send-file,
ascii-xfr
это была моя командная строка подключенияОбычно мы хотим
ascii-xfr
на принимающей стороне, но так как у нас его нет, это обходится-n
, поддерживая правильные окончания строк.Приемник:
Теперь, когда мы подключились, перейдите в каталог, где вы хотите получить полученный файл.
На picocom я просто нажимаю CTRL + a + s и ввожу полный путь к файлу, который отправляю. Как только передача завершится, вам нужно нажать CTRL + c, чтобы прервать это
cat
.Теперь мы декодируем файл,
Сделайте все возможное, чтобы убедиться, что файл ИДЕНТИЧНЫЙ для того, который вы отправили, потому что передача ASCII не имеет защиты контрольной суммы. У моего получающего ящика была
sha512sum
, но любой команды контрольной суммы было бы достаточно. Как только вы вручную подтвердите совпадение сумм, вы можете предположить, что перевод прошел успешно!источник
\r\n
или просто\n
оба работают, даже если они "исправлены" по пути. Я не припомню, если это в стандарте base64 или просто в инструментах, которые я использовал, но я подозреваю, что на самом деле это стандартное поведение.Может быть, вы должны попробовать Minicom .
источник
Не знаю, сработает ли это, если бы у вас была только последовательная консоль, но если у вас вообще есть доступ к сети, вы можете использовать ее
nc(1)
для копирования файлов с использованием TCP / IP.В приведенном выше примере я клонировал
sdbYYY
из поля источника в полеsdaXXX
назначения. Мой выбор 8675 для номера порта TCP был произвольным; Вы можете использовать любой порт, к которому у вас есть доступ. И это не должно быть устройство; это может быть любой файл.Во втором примере я скопировал свой открытый ключ rsa (
~/.ssh/id_rsa.pub
) и добавил его в файл авторизованных ключей для целевого хоста.источник
Я бы использовал kermit , прародителя программ передачи файлов. Мы использовали это уже задолго до того, как появился Linux.
источник