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

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

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

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

решение1

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

У меня есть 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-загрузки» локальной последовательной консоли:

$ 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на удаленную систему. Конвейер принимает данные в формате uuencoded и декодирует их в бинарный tarball, который вы можете распаковать и собрать.

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

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


Сноски:

  1. миником,пикоком,Шпатлевка,ЭЛТ ВанДайка...

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

    Ваша локальная версия uuencodeможет вести себя иначе.

решение2

По сути, вам нужно использовать методы доинтернета для передачи через последовательный 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

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

Теперь мы расшифруем файл,

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

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

решение3

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

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

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

[email protected] $ nc -l 12345 >> ~/.ssh/authorized_keys
[email protected] $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345

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

решение4

я хотел бы использоватькермит, прародитель программ передачи файлов. Мы использовали его еще задолго до появления Linux.

Связанный контент