Як отримати файл до хоста, коли у вас є лише послідовна консоль?


21

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

Вирізати / вставити працює для дрібних матеріалів для друку / друку, і я грав із комбінацією uuencode / uudecode (з gzip) для обробки недрукуваного, але все це дуже обмежує.


З огляду на деякі коментарі, які ви залишили щодо доступності утиліт, це допоможе, якщо ви зможете назвати платформу та / або окреслити середовище, в якому ви перебуваєте. В іншому випадку ви збираєтеся отримати акцію Kermit / XMODEM / YMODEM / ZMODEMk через термінальні відповіді ...
Avery Payne

Більшу частину дня я провожу за коробкою Solaris. Таким чином, якщо б у вас був 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 завантаження" локальної послідовної консолі:

$ 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, і розшифровує їх до двійкового тарболу для вас, який ви можете розпакувати та створити.

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

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


Виноски:

  1. minicom , 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 .


Не вимагає цього на вихідному хості щось на зразок 'sx' або 'sz'?
Стівен Павло Лесневський

4
Ні, minicom обробляє власні файли xfers. sx, sy, sz і rx, ry, rz - це окремі програми, зазвичай їх можна знайти в пакетах, влучно названих lszrz або щось подібне. Хоча я б запропонував використовувати sz та rz. Невеликий, простий і він робить те, що робить. Minicom - це цілий термінальний емулятор.
reiche

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.


Ага так .. Я пам'ятаю, що робив це, але в цьому випадку kermit не встановлюється на вихідному хості.
Стівен Павло Лесневський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.