직렬 콘솔 만 있으면 호스트에 파일을 얻는 방법은 무엇입니까?


20

직렬 콘솔 (터미널 서버를 통한 텔넷을 통한) 만 있으면 호스트 안팎으로 파일을 전송하는 데 어떤 방법을 사용할 수 있습니까?

잘라 내기 / 붙여 넣기는 작은 / 인쇄 가능한 물건에 작동하며 나는 uuencode / uudecode (gzip과 함께)가 인쇄 할 수없는 핸들을 처리하여 재생했지만 모두 매우 제한적입니다.


유틸리티 가용성에 대해 남겨둔 의견 중 일부는 플랫폼의 이름을 지정하거나 현재 환경을 요약 할 수 있으면 도움이 될 것입니다. 그렇지 않으면 주식 Kermit / XMODEM / YMODEM /을 얻습니다. 터미널 답변을 통해 ZMODEMk ...
Avery Payne

나는 대부분의 하루를 솔라리스 박스 뒤에서 보낸다. 그렇다면 SUNCreq (또는 아마도 SUNWCuser) 만 있다면 무엇을 대답 하시겠습니까?
Stephen Paul Lesniewski

단지 5 년 늦었다. : P 이제 당신이 원했던 것이었기 때문에 내 대답을 받아 들일 수있다. 그러나 오늘날에는 필요하지 않을 것이다.
JM 베커

답변:


12

연결의 다른 쪽 끝에서 사용할 직렬 콘솔 프로그램 ¹은 파일을 원격으로 보낼 수있는 방법이 있습니다. 정확히 어떻게 진행하는지는 원격 시스템에서 사용 가능한 리소스에 따라 다릅니다.

나는 lrzsz또는 kermit원격쪽에

솔리드 바이너리 파일 전송 프로그램과 같은 원격 측에 설치되어있는 경우 가장 쉬운 경우는 lrzszkermit. 이것은 오늘날보다 한 번 더 흔했지만 특정 시스템에는 여전히이 중 하나가있을 수 있습니다.

로컬에서 사용하는 직렬 콘솔 프로그램에는 Zmodem 또는 Kermit 업로드를 수행 할 수있는 방법이 거의있어 필요한 모든 것을 직접 보낼 수 있습니다.

Zmodem의 경우 rz원격 시스템에서 입력 하면 로컬 직렬 터미널이 이해해야하는 특수 문자열이 전송되어 파일 선택기 대화 상자가 나타납니다.

커밋은 더 간단한 프로토콜이므로이 경우 수동으로 전송을 시작해야합니다.

나는 할 일이 이진 파일 전송 프로그램을 가지고,하지만 난 할 일이 없습니다 uuencode/base64

이 같은 적절한 바이너리 파일 전송 프로그램을 사용하여 몇 가지 장점 lrzsz이나 kermit: 등 효율성, 체크섬, 자동 재시도, 중단 된 전송의 재개, 다수의 파일 전송은,하지만, 이러한이다 사치 . 하나의 파일 만 보내거나 파일을 거의 보내지 않는 경우 ASCII 업로드를 사용하여 벗어날 수 있습니다.

때문에 터미널 프로토콜이 바이너리 데이터 파일에서 발생하는 바이트 값의 많은 해석, 동일한 연결을 통해 파일을 직접 보낼 수 없습니다; 그렇게하면 양쪽 끝에있는 터미널 에뮬레이션 코드가 일부 데이터를 해석하여 데이터를 손상 시키고 터미널 처리 코드를 혼동 할 수 있습니다.

이진 데이터를 로컬의 안전한 ASCII 하위 집합으로 인코딩 한 다음 원격의 원시 이진 데이터로 다시 변환하여이 문제를 해결할 수 있습니다. 이것은 사소한 알고리즘 선택에서만 다른 프로그램 uuencodebase64프로그램입니다.

로컬 시스템에서 파일을 인코딩합니다 .²

$ 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

첫 번째 명령을 시작한 후 lrzsz.tgz.uue파일을 "ASCII 업로드" 하여 원격 시스템에 수행하십시오. 파이프 라인은 uuencoded 데이터를 받아서 바이너리 tarball로 디코딩하여 압축을 풀고 빌드 할 수 있습니다.

하지만 원격 시스템에 C 컴파일러가 없습니다.

원격 시스템에 컴파일러가없는 경우 로컬 시스템 의 (또는 무엇이든) 프로그램을 크로스 컴파일rz 하고 위의 기술을 사용하여 원격 시스템으로 보낼 수 있습니다.


각주 :

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

  2. 입력 파일 이름을이 버전의 uuencode두 번, 한 번 입력 데이터 소스의 이름을 지정하고 원격 시스템이 데이터를 출력 파일로 디코딩 할 때 파일을 호출해야하는 대상을 다시 선언해야합니다. 원격 시스템의 출력 파일 이름이 다를 수 있습니다.

    로컬 버전 uuencode이 다르게 작동 할 수 있습니다.


환상적인, 나는이 질문에 커밋을 언급하는 대답이 있기를 바랐습니다! +1;)
Tim

이것은 좋은 대답입니다. 저는 "하지만 가지고 있지 않습니다"섹션을 좋아합니다. 불행히도, 그것은 꽤 팝적인 것들에서 멈추고 정말로 깊이 가지 않습니다. ASCII 코드만으로 다른 아키텍처의 바이너리 실행 파일을 만드시겠습니까? 여기 부트 스트랩이 있습니다 : retrocomputing.stackexchange.com/questions/4672/…
pfalcon

5

기본적으로 직렬 tty를 통해 전송하려면 사전 인터넷 방법을 사용해야하며 다른 쪽에서 전송을 수신 할 수있는 방법이 있어야합니다. 이 작업을 수행하는 가장 좋은 방법은 ZMODEM을 사용하는 것입니다. 즉 sz, 수신 측에 이미 도구가 있어야합니다 . 그러나 수신 대상이 네트워크가없는 라우터 인 경우와 같이 항상 가능한 것은 아닙니다.

이 전송을 수행 할 수있는 유일한 방법은 8 비트 이전 클린 스타일의 터미널 안전 ASCII를 사용하여 채널을 직접 통과하는 것입니다. 더 현대적인 도구를 사용하려고합니다. 대부분의 시스템에 설치되기를 바랍니다.

송신기:

먼저 파일을 인코딩합니다

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있지만 체크섬 명령으로 충분합니다. 합계가 일치하는지 수동으로 확인하면 전송이 완료된 것으로 가정 할 수 있습니다!


(그리고 2 년 후 ...) 줄 끝을 망치는 시스템 (Microsoft에게 감사드립니다!)을 통해 파일을 전송 해야하는 경험에서 base64 인코딩 / 디코딩은 줄 끝 스타일에 신경 쓰지 않습니다. \r\n또는 \n길을 따라 "고정"된 경우에도 둘 다 작동합니다. 그것이 base64 표준이나 내가 사용한 도구에 불과하다면 손을 떠올리지는 않지만 실제로 표준 동작이라고 생각합니다.
Andrew Henle

5

아마도 당신은 minicom 을 시도 해야합니다 .


소스 호스트에서 'sx'또는 'sz'와 같은 것이 필요하지 않습니까?
Stephen Paul Lesniewski

4
아니, minicom은 자체 파일 xfer를 처리합니다. sx, sy, sz 및 rx, ry, rz는 별도의 프로그램으로 보통 lszrz 또는 다른 이름의 패키지에 들어 있습니다. sz와 rz를 사용하는 것이 좋습니다. 작고 간단하며 그것이하는 일을합니다. Minicom은 전체 터미널 에뮬레이터입니다.
reiche

4
이 답변은 정확하지 않습니다. Minicom은 파일 전송을 위해 lrzsz를 생성합니다. Minicom은 자체 파일 전송을 처리 할 수 ​​없으며 처리 할 수 ​​없습니다.
Jonathan Cline 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에서 대상 상자 로 복제 했습니다 . TCP 포트 번호로 8675를 선택한 것은 임의였습니다. 액세스 할 수있는 모든 포트를 사용할 수 있습니다. 또한 장치 일 필요는 없습니다. 모든 파일이 될 수 있습니다.

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 을 사용 합니다. 우리는 이미 리눅스가 있기 오래 전에 그것을 사용했습니다.


ahh yes .. 그렇게하는 것을 기억하지만이 경우 kermit은 소스 호스트에 설치되지 않습니다.
Stephen Paul Lesniewski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.