Làm cách nào để nhận tệp đến máy chủ khi tất cả những gì bạn có là bảng điều khiển nối tiếp?


20

Khi tất cả những gì bạn có là một bàn điều khiển nối tiếp (nói qua telnet qua máy chủ đầu cuối), phương pháp nào có thể được sử dụng để truyền tệp vào / ra khỏi máy chủ?

Cắt / dán hoạt động cho các công cụ nhỏ / có thể in và tôi đã chơi với sự kết hợp của uuencode / uudecode (với gzip) xử lý không thể in được nhưng tất cả đều rất hạn chế.


Đưa ra một số ý kiến ​​bạn đã để lại về tính khả dụng của các tiện ích, sẽ hữu ích nếu bạn có thể đặt tên cho nền tảng và / hoặc phác thảo môi trường bạn đang ở. Nếu không, bạn sẽ nhận được cổ phiếu Kermit / XMODEM / YMODEM / ZMODEMk thông qua các câu trả lời của thiết bị đầu cuối ...
Avery Payne

Tôi dành phần lớn thời gian trong ngày phía sau hộp Solaris. Vì vậy, trong các điều khoản đó, nếu tất cả những gì bạn có là SUNCreq (hoặc có lẽ là SUNWCuser), bạn sẽ trả lời thế nào?
Stephen Paul Lesniewski

chỉ trễ 5 năm ,: P Bây giờ bạn có thể chấp nhận câu trả lời của tôi, bởi vì đó chính xác là những gì bạn muốn .... nhưng có thể không cần đến ngày hôm nay.
JM Becker

Câu trả lời:


12

Các chương trình bàn điều khiển nối tiếp - bạn sẽ sử dụng ở đầu kia của kết nối sẽ có một số cách để gửi tệp đến phía xa. Làm thế nào chính xác bạn đi về nó phụ thuộc vào những tài nguyên bạn có sẵn trên hệ thống từ xa.

Tôi có lrzszhoặc kermitở phía xa

Trường hợp dễ nhất là nếu bạn có một chương trình truyền tệp nhị phân vững chắc được cài đặt ở phía xa như lrzszhoặc kermit. Điều này đã từng phổ biến hơn ngày nay, nhưng hệ thống cụ thể của bạn vẫn có thể có một trong số đó.

Chương trình bảng điều khiển nối tiếp mà bạn đang sử dụng ở phía cục bộ gần như chắc chắn có cách thực hiện tải lên Zmodem hoặc Kermit, cho phép bạn gửi bất cứ thứ gì bạn cần trực tiếp.

Trong trường hợp của Zmodem, chỉ cần gõ rztrên hệ thống từ xa, nó sẽ gửi một chuỗi đặc biệt mà thiết bị đầu cuối nối tiếp cục bộ sẽ hiểu, khiến nó bật lên hộp thoại chọn tệp.

Kermit là một giao thức đơn giản hơn, vì vậy bạn phải bắt đầu chuyển giao thủ công trong trường hợp đó.

Tôi không có Chương trình chuyển tệp nhị phân, nhưng tôi có uuencode/base64

Có một số lợi thế khi sử dụng chương trình truyền tệp nhị phân thích hợp như lrzsz hoặc kermit: hiệu quả, kiểm tra lại, tự động thử lại, hủy bỏ chuyển tiếp, chuyển nhiều tệp, v.v., nhưng đây là những điều xa xỉ . Nếu bạn chỉ cần gửi một tệp hoặc hiếm khi gửi tệp, bạn có thể thoát khỏi tải lên ASCII.

Bởi vì các giao thức đầu cuối diễn giải nhiều giá trị byte xảy ra trong tệp dữ liệu nhị phân, bạn không thể gửi tệp trực tiếp qua cùng một kết nối; nếu bạn làm như vậy, mã mô phỏng đầu cuối ở một trong hai đầu sẽ cố gắng diễn giải một số dữ liệu, làm hỏng dữ liệu và có thể gây nhầm lẫn cho mã xử lý thiết bị đầu cuối.

Bạn giải quyết vấn đề này bằng cách mã hóa dữ liệu nhị phân thành một tập hợp con an toàn của ASCII ở phía cục bộ, sau đó biến nó trở lại thành dữ liệu nhị phân thô ở phía xa. Đây là những gìuuencodebase64các chương trình làm, chỉ khác nhau trong các lựa chọn thuật toán nhỏ.

Trên hệ thống cục bộ, bạn mã hóa tệp: ²

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

Sau đó, bạn nhập lệnh này trên hệ thống từ xa và gửi tệp bằng tính năng "tải lên ASCII" của bảng điều khiển nối tiếp cục bộ:

$ cat | uudecode

Khi quá trình tải lên tệp kết thúc, nhấn Ctrl-C để thoát ra cat. Bây giờ bạn có tệp giải mã của bạn trên hệ thống từ xa, như bạn muốn.

Nhưng tôi có nhiều tệp để gửi và mã hóa ASCII có thể in được là một nỗi đau!

Không khó để tự khởi động bản thân với trình độ công nghệ cao hơn. Nếu hệ thống từ xa có trình biên dịch C, bạn có thể sử dụng kỹ thuật trước đó để gửi cho hệ thống từ xa một bản sao củalrzsz mã nguồn. Về phía địa phương:

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

Sau đó, trên hệ thống từ xa, nhập cái này qua chương trình bàn điều khiển nối tiếp:

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

Sau khi bạn bắt đầu lệnh đầu tiên, hãy thực hiện "tải lên ASCII" của lrzsz.tgz.uue tệp vào hệ thống từ xa. Đường ống chấp nhận dữ liệu uuencoding và giải mã nó thành tarball nhị phân cho bạn, bạn có thể giải nén và xây dựng.

Nhưng tôi không có trình biên dịch C trên hệ thống từ xa

Nếu bạn thậm chí không có một trình biên dịch trên hệ thống từ xa, bạn có thể vượt qua biên dịch các rzchương trình (hoặc bất kỳ) trên hệ thống địa phương và gửi nó vào hệ thống từ xa bằng cách sử dụng kỹ thuật nói trên.


Chú thích:

  1. minicom , picocom , PuTTY , VanDyke CRT ...

  2. Bạn phải đặt tên tệp đầu vào cho phiên bản này của uuencode hai lần, một lần để đặt tên cho nguồn dữ liệu đầu vào và một lần nữa để khai báo hệ thống từ xa sẽ gọi tệp khi giải mã dữ liệu thành tệp đầu ra. Bạn có thể hình dung muốn hệ thống từ xa có một tên khác cho tệp đầu ra của nó.

    Phiên bản địa phương của bạn uuencodecó thể cư xử khác nhau.


Thật tuyệt vời, tôi đã hy vọng câu hỏi này có một câu trả lời đề cập đến kermit! +1;)
Tim

Đây là câu trả lời hay, tôi thích phần "Nhưng tôi không có". Thật không may, nó dừng lại ở những thứ khá pop và không đi sâu lắm. Tạo các tệp thực thi nhị phân cho các kiến ​​trúc khác nhau chỉ từ mã ASCII? Dưới đây là cho bootstrap: retrocomputing.stackexchange.com/questions/4672/...
pfalcon

5

Về cơ bản, bạn phải sử dụng các phương thức tiền internet để chuyển qua một tty nối tiếp và bạn phải có cách để nhận chuyển khoản ở phía bên kia. Rõ ràng cách tốt nhất để làm điều này là sử dụng ZMODEM, có nghĩa là bạn cần phải có một công cụ nhưsz đã có ở đầu nhận. Tuy nhiên, điều này không phải lúc nào cũng có thể, ví dụ, khi mục tiêu nhận là một bộ định tuyến không có mạng.

Cách duy nhất có thể để thực hiện việc chuyển tiền này là trực tiếp qua kênh, sử dụng ASCII an toàn đầu cuối, theo kiểu sạch trước 8 bit. Tôi sẽ sử dụng các công cụ hiện đại hơn, mà tôi hy vọng sẽ được cài đặt trên hầu hết các hệ thống.

Người gửi:

Đầu tiên chúng tôi mã hóa tập tin của chúng tôi

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

Bây giờ hãy chắc chắn rằng lệnh gửi tệp com của bạn là ascii-xfr, đây là dòng lệnh kết nối của tôi

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

Thông thường chúng tôi muốn ascii-xfrở bên nhận, nhưng vì chúng tôi không có nó, nên-n vấn đề này bằng cách duy trì kết thúc dòng chính xác.

Người nhận:

Bây giờ chúng tôi đã kết nối, hãy chuyển đến thư mục mà bạn muốn nhận tệp.

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

Trên picocom, tôi chỉ cần CTRL + a + s và nhập đường dẫn đầy đủ của tệp tôi đang gửi. Khi quá trình chuyển hoàn tất, bạn sẽ cần CTRL + c để phá vỡ điều đó cat.

Bây giờ chúng tôi giải mã tập tin,

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

Làm bất cứ điều gì bạn có thể để xác minh rằng tệp đó là SẮC đối với tệp bạn đã gửi, bởi vì chuyển ASCII không có bảo vệ tổng kiểm tra. Hộp nhận của tôi đã có sha512sum, nhưng bất kỳ lệnh tổng kiểm tra nào cũng đủ. Khi bạn xác nhận số tiền khớp một cách thủ công, bạn có thể cho rằng việc chuyển tiền đã thành công!


(Và hai năm sau ...) theo kinh nghiệm của tôi khi phải chuyển các tệp qua các hệ thống kết thúc dòng (cảm ơn Microsoft!), Mã hóa / giải mã cơ sở64 không quan tâm đến kiểu kết thúc dòng. \r\nhoặc chỉ \ncả hai hoạt động ngay cả khi chúng được "cố định" trên đường đi. Tôi không nhớ lại nếu đó là trong tiêu chuẩn cơ sở64 hoặc chỉ là các công cụ tôi đã sử dụng, nhưng tôi nghi ngờ đó thực sự là hành vi tiêu chuẩn.
Andrew Henle

5

Có lẽ bạn nên thử minicom .


Điều này không yêu cầu một cái gì đó như 'sx' hoặc 'sz' trên máy chủ nguồn?
Stephen Paul Lesniewski

4
Không, minicom xử lý các tập tin của riêng mình. sx, sy, sz và rx, ry, rz là các chương trình riêng biệt, thường được tìm thấy trong các gói có tên là lszrz hoặc một cái gì đó. Mặc dù tôi sẽ đề nghị sử dụng sz và rz. Nhỏ, đơn giản và nó làm những gì nó làm. Minicom là một trình giả lập toàn bộ thiết bị đầu cuối.
reiche

4
Câu trả lời này không đúng. Minicom sinh ra lrzsz để chuyển tập tin. Minicom không thể và không xử lý việc chuyển tập tin của chính nó.
Jonathan Cline IEEE

5

Không biết điều này có hoạt động không nếu tất cả những gì bạn có là một bàn điều khiển nối tiếp, nhưng nếu bạn có quyền truy cập mạng, thì bạn có thể sử dụng nc(1)để sao chép các tệp bằng 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

Trong ví dụ trên, tôi đã nhân bản sdbYYYtừ hộp nguồn sang sdaXXXhộp đích. Lựa chọn 8675 của tôi cho số cổng TCP là tùy ý; bạn có thể sử dụng bất kỳ cổng nào bạn có quyền truy cập. Và nó không phải là một thiết bị; nó có thể là bất kỳ tập tin nào

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

Trong ví dụ thứ hai, tôi đã sao chép khóa công khai rsa của mình ( ~/.ssh/id_rsa.pub) và thêm nó vào tệp khóa được ủy quyền cho máy chủ đích.


5
Tôi có thể đề nghị một dấu hiệu cảnh báo lớn màu đỏ trên ý tưởng đầu tiên của bạn? Một số linh hồn cô đơn với trái tim học hỏi có thể thực hiện một cái gì đó như thế với hy vọng sao chép chỉ các tập tin, mà không cần đọc đoạn văn sau đây tất nhiên :)
reiche

2

Tôi sẽ sử dụng kermit , ông bà của các chương trình filetransfer. Chúng tôi đã sử dụng nó từ lâu trước khi có Linux.


ahh vâng .. Tôi nhớ làm điều đó nhưng trong trường hợp này kermit không cài đặt trên máy chủ nguồn.
Stephen Paul Lesniewski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.