Bagaimana cara mendapatkan file ke host ketika semua yang Anda miliki adalah konsol serial?

20

Ketika semua yang Anda miliki adalah konsol serial (katakanlah melalui telnet melalui server terminal), metode apa yang dapat digunakan untuk mentransfer file masuk / keluar dari host?

Cut / paste berfungsi untuk hal-hal kecil / dapat dicetak dan saya telah bermain dengan kombinasi uuencode / uudecode (dengan gzip) menangani yang tidak patut dicetak tetapi itu semua sangat membatasi.

Stephen Paul Lesniewski
sumber
Mengingat beberapa komentar yang tersisa tentang ketersediaan utilitas, akan membantu jika Anda bisa menyebutkan nama platform dan / atau menguraikan lingkungan tempat Anda berada. Jika tidak, Anda akan mendapatkan stok Kermit / XMODEM / YMODEM / ZMODEMk via jawaban terminal ...
Avery Payne
Saya menghabiskan sebagian besar hari saya di belakang kotak Solaris. Jadi dalam istilah itu, jika yang Anda miliki adalah SUNCreq (atau mungkin SUNWCuser) apa yang akan Anda jawab?
Stephen Paul Lesniewski
terlambat 5 tahun,: P Sekarang Anda dapat menerima jawaban saya, karena memang itulah yang Anda inginkan .... tetapi kemungkinan besar tidak perlu hari ini.
JM Becker

Jawaban:

12

Program konsol serial¹ yang akan Anda gunakan di ujung koneksi yang lain akan memiliki beberapa cara untuk mengirim file ke sisi jarak jauh. Bagaimana tepatnya Anda melakukannya tergantung pada sumber daya apa yang Anda miliki pada sistem jarak jauh.

Saya Memiliki lrzszatau kermitdi Sisi Remote

Kasus termudah adalah jika Anda memiliki program transfer file biner padat yang diinstal di sisi jarak jauh seperti lrzszatau kermit. Ini dulunya lebih umum daripada hari ini, tetapi sistem khusus Anda mungkin masih memiliki salah satunya.

Program konsol serial yang Anda gunakan di sisi lokal hampir pasti memiliki cara untuk melakukan unggahan Zmodem atau Kermit, yang memungkinkan Anda mengirim apa pun yang Anda butuhkan secara langsung.

Dalam kasus Zmodem, ketikkan saja rzpada sistem jarak jauh, yang mengirimkan string khusus yang harus dipahami terminal serial lokal, yang menyebabkannya memunculkan dialog pemilih file.

Kermit adalah protokol yang lebih sederhana, jadi Anda harus memulai transfer secara manual dalam kasus itu.

Saya Tidak Memiliki Program Transfer File Biner, tetapi Saya Memiliki uuencode/base64

Ada beberapa keuntungan menggunakan program transfer file biner yang tepat seperti lrzszatau kermit: efisiensi, checksumming, coba ulang otomatis, kembalinya transfer yang dibatalkan, transfer file multipel, dll., Tetapi ini adalah kemewahan . Jika Anda hanya perlu mengirim satu file, atau jarang mengirim file, Anda dapat menghapus unggahan ASCII.

Karena protokol terminal menafsirkan banyak nilai byte yang terjadi dalam file data biner, Anda tidak dapat mengirim file secara langsung melalui koneksi yang sama; jika Anda melakukannya, kode emulasi terminal di kedua ujung akan mencoba untuk menafsirkan beberapa data, merusak data dan kemungkinan membingungkan kode penanganan terminal juga.

Anda menyiasatinya dengan menyandikan data biner ke dalam subset ASCII yang aman di sisi lokal, lalu mengubahnya kembali menjadi data biner mentah di sisi jarak jauh. Inilah yang uuencodedan base64program lakukan, hanya berbeda dalam pilihan algoritma kecil.

Pada sistem lokal, Anda menyandikan file: ²

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

Kemudian Anda mengetik perintah ini pada sistem jarak jauh, dan mengirim file menggunakan fitur "ASCII upload" konsol serial:

$ cat | uudecode

Ketika unggahan file selesai, tekan Ctrl-Cuntuk keluar cat. Sekarang Anda memiliki file yang sudah diterjemahkan pada sistem remote, seperti yang Anda inginkan.

Tetapi saya memiliki banyak file untuk dikirim, dan Transcoding ASCII yang dapat dicetak sangat merepotkan!

Tidak sulit untuk melakukan bootstrap sendiri ke tingkat teknologi yang lebih tinggi. Jika sistem jarak jauh memiliki kompiler C, Anda dapat menggunakan teknik sebelumnya untuk mengirim salinan lrzszkode sumber sistem jarak jauh . Di sisi lokal:

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

Kemudian pada sistem jarak jauh, ketikkan ini melalui program konsol serial:

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

Setelah Anda memulai perintah pertama, lakukan "unggahan ASCII" dari lrzsz.tgz.uuefile ke sistem jarak jauh. Pipeline menerima data yang uuencoded dan mendekodekannya menjadi tarball biner untuk Anda, yang dapat Anda ekstrak dan bangun.

Tapi saya tidak punya C Compiler di Remote System

Jika Anda bahkan tidak memiliki kompiler pada sistem jarak jauh, Anda dapat melakukan kompilasi silang program rz(atau apa pun) pada sistem lokal dan mengirimkannya ke sistem jarak jauh menggunakan teknik di atas.


Catatan kaki:

  1. minicom , picocom , Putty , VanDyke CRT ...

  2. Anda harus memberikan nama file input ke versi ini uuencodedua kali, satu kali untuk memberi nama sumber data input, dan sekali lagi untuk menyatakan apa yang sistem panggilan jarak jauh harus memanggil file ketika itu menerjemahkan data ke file output. Anda mungkin ingin sistem jarak jauh memiliki nama yang berbeda untuk file outputnya.

    Versi lokal Anda uuencodemungkin berperilaku berbeda.

Warren Young
sumber
Luar biasa, saya berharap pertanyaan ini memiliki jawaban yang menyebutkan kermit! +1;)
Tim
Ini jawaban yang bagus, saya suka bagian "Tapi Saya Tidak Memiliki". Sayangnya, itu berhenti pada hal-hal yang cukup pop dan tidak masuk terlalu dalam. Membuat file biner yang dapat dieksekusi untuk arsitektur yang berbeda hanya dari kode ASCII saja? Ini untuk bootstrap: retrocomputing.stackexchange.com/questions/4672/…
pfalcon
5

Pada dasarnya Anda harus menggunakan metode pra-internet untuk mentransfer melalui serial tty, dan Anda harus memiliki cara untuk menerima transfer di sisi lain. Jelas cara terbaik untuk melakukan ini adalah dengan menggunakan ZMODEM, yang berarti Anda harus memiliki alat seperti yang szsudah ada di pihak penerima. Namun ini tidak selalu mungkin, misalnya, ketika target penerima adalah router tanpa jaringan.

Satu-satunya cara yang mungkin untuk melakukan transfer ini adalah langsung melalui saluran, menggunakan terminal safe ASCII, dengan gaya bersih pra-8-bit. Saya akan menggunakan alat yang lebih modern, yang saya harap diinstal pada sebagian besar sistem.

Pengirim:

Pertama kita mengkodekan file kita

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

Sekarang pastikan perintah com send-file Anda adalah ascii-xfr,, ini adalah baris perintah koneksi saya

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

Biasanya kami ingin ascii-xfrdi sisi penerima, tetapi karena kami tidak memilikinya, yang -nbekerja di sekitar ini dengan mempertahankan ujung garis yang benar.

Penerima:

Sekarang kita telah terhubung, buka direktori tempat Anda menginginkan file yang diterima.

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

Di picocom, saya hanya CTRL + a + s , dan masukkan path lengkap file yang saya kirim. Setelah transfer selesai, Anda perlu CTRL + c untuk menghentikannya cat.

Sekarang kita mendekode file,

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

Lakukan apa pun yang Anda bisa untuk memverifikasi file yang IDENTIK untuk yang Anda kirim, karena transfer ASCII tidak memiliki perlindungan checksum. Kotak penerima saya punya sha512sum, tetapi perintah checksum apa pun sudah cukup. Setelah Anda secara manual mengkonfirmasi kecocokan jumlah, Anda dapat menganggap transfer berhasil!

JM Becker
sumber
(Dan dua tahun kemudian ...) dalam pengalaman saya harus mentransfer file di seluruh sistem yang membuat ujung jalur (terima kasih Microsoft!), Encoding / decoding base64 tidak peduli dengan gaya garis akhir. \r\natau hanya \nkeduanya bekerja bahkan jika mereka "diperbaiki" di sepanjang jalan. Saya tidak ingat lagi jika itu dalam standar base64 atau hanya alat yang saya gunakan, tapi saya curiga itu sebenarnya perilaku standar.
Andrew Henle
5

Mungkin Anda harus mencoba minicom .

elmarco
sumber
Bukankah ini memerlukan sesuatu seperti 'sx' atau 'sz' pada host sumber?
Stephen Paul Lesniewski
4
Tidak, minicom menangani file xfers sendiri. sx, sy, sz dan rx, ry, rz adalah program yang terpisah, biasanya ditemukan dalam paket yang diberi nama lszrz atau apalah. Meskipun saya sarankan menggunakan sz dan rz. Kecil, sederhana dan melakukan apa yang dilakukannya. Minicom adalah emulator terminal keseluruhan.
reiche
4
Jawaban ini tidak benar. Minicom memunculkan lrzsz untuk transfer file. Minicom tidak bisa dan tidak menangani transfer file sendiri.
Jonathan Cline IEEE
5

Tidak tahu apakah ini akan berfungsi jika semua yang Anda miliki adalah konsol serial, tetapi jika Anda memiliki akses jaringan sama sekali, maka Anda dapat menggunakannya nc(1)untuk menyalin file menggunakan 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

Dalam contoh di atas, saya mengkloning sdbYYYdari kotak sumber ke sdaXXXkotak tujuan. Pilihan saya 8675 untuk nomor port TCP adalah arbitrer; Anda dapat menggunakan porta apa pun yang dapat Anda akses. Dan itu tidak harus berupa perangkat; itu bisa berupa file apa saja.

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

Pada contoh kedua, saya menyalin kunci publik rsa saya ( ~/.ssh/id_rsa.pub) dan menambahkannya ke file kunci resmi untuk host target.

Kevin M.
sumber
5
Mungkinkah saya menyarankan tanda peringatan merah besar di atas ide pertama Anda? Jiwa yang kesepian dengan hati untuk belajar mungkin menjalankan sesuatu seperti itu dengan harapan menyalin file-file saja, tanpa membaca paragraf berikut terlebih dahulu tentu saja :)
reiche
2

Saya akan menggunakan kermit , kakek dari program transfer file. Kami menggunakan itu sudah lama sebelum ada Linux.

txwikinger
sumber
ahh ya .. Saya ingat melakukan itu tetapi dalam hal ini kermit tidak menginstal pada host sumber.
Stephen Paul Lesniewski