가지고 있는 것이 직렬 콘솔뿐인데 호스트에 파일을 가져오는 방법은 무엇입니까?

가지고 있는 것이 직렬 콘솔뿐인데 호스트에 파일을 가져오는 방법은 무엇입니까?

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

잘라내기/붙여넣기는 작은/인쇄 가능한 항목에 작동하며 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

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

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

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


각주:

  1. 미니컴,피코콤,퍼티,반다이크 CRT...

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

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

답변2

기본적으로 직렬 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

피코콤에서는 그냥CTRL+A+S을 클릭하고 제가 보내는 파일의 전체 경로를 입력하세요. 이전이 완료되면 다음을 수행해야 합니다.CTRL+C그걸 깨려고요 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대상 상자로 복제했습니다. TCP 포트 번호로 8675를 선택한 것은 임의적이었습니다. 액세스할 수 있는 모든 포트를 사용할 수 있습니다. 그리고 그것이 반드시 장치일 필요는 없습니다. 어떤 파일이든 가능합니다.

[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가 있기 오래 전에 이미 그것을 사용했습니다.

관련 정보