가지고 있는 것이 직렬 콘솔뿐인 경우(예: 터미널 서버를 통한 텔넷을 통해) 호스트 시스템과 파일을 주고받는 데 어떤 방법을 사용할 수 있습니까?
잘라내기/붙여넣기는 작은/인쇄 가능한 콘텐츠에 작동합니다. 인쇄할 수 없는 콘텐츠를 처리하기 위해 uuencode/uudecode 조합(gzip 사용)을 사용했지만 이는 모두 매우 제한적입니다.
답변1
연결의 다른 쪽 끝에서 사용할 직렬 콘솔 프로그램에는 파일을 원격 측으로 보내는 방법이 있습니다. 진행 방법은 원격 시스템에서 사용 가능한 리소스에 따라 다릅니다.
내가 가지고 있거나 lrzsz
먼 kermit
쪽에
가장 간단한 경우는 원격 측에 신뢰할 수 있는 바이너리 파일 전송 프로그램이 설치되어 있는 경우입니다.lrzsz
또는kermit
. 이는 오늘날보다 더 일반적이었지만 특정 시스템에는 여전히 이러한 중 하나가 있을 수 있습니다.
로컬에서 사용하는 직렬 콘솔 프로그램에는 Zmodem 또는 Kermit 업로드를 수행하는 방법이 거의 확실하므로 필요한 것을 직접 보낼 수 있습니다.
Zmodem을 사용하면 원격 시스템에 입력하기만 rz
하면 시스템이 로컬 직렬 터미널이 이해해야 하는 특수 문자열을 내보내므로 파일 선택기 대화 상자가 나타납니다.
Kermit은 더 간단한 프로토콜이므로 이 경우 전송을 수동으로 시작해야 합니다.
바이너리 파일 전송 프로그램은 없지만 uuencode
/ 는 있습니다.base64
lrzsz
적절한 바이너리 파일 전송 프로그램(예: or)을 사용하면 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
(또는 기타) 로컬 시스템에서 프로그래밍하고 위에 설명된 기술을 사용하여 원격 시스템으로 보냅니다.
각주:
uuencode
이 버전에서는 입력 파일 이름을 두 번 제공해야 합니다 . 한 번은 입력 데이터 소스의 이름을 지정하고, 한 번은 데이터를 출력 파일로 디코딩할 때 원격 시스템이 파일을 호출해야 함을 선언해야 합니다. 원격 시스템의 출력 파일에 다른 이름을 지정할 수 있습니다.로컬 버전은
uuencode
다르게 작동할 수 있습니다.
답변2
기본적으로 직렬 tty를 통해 전송하려면 인터넷 이전 방법을 사용해야 하며, 상대방에서 전송을 수신할 수 있는 방법이 있어야 합니다. 분명히 가장 좋은 방법은 ZMODEM을 사용하는 것입니다. 즉, sz
수신 측에 이미 가지고 있는 것과 유사한 도구가 필요하다는 의미입니다 . 그러나 이는 수신 대상이 네트워크가 없는 라우터인 경우와 같이 항상 가능한 것은 아닙니다.
이 전송을 수행할 수 있는 유일한 방법은 상위 8비트 클린 스타일로 터미널 안전 ASCII를 사용하여 채널을 통해 직접적으로 수행하는 것입니다. 나는 대부분의 시스템에 설치되기를 바라는 보다 현대적인 도구를 사용할 것입니다.
보내는 사람:
먼저 파일을 인코딩합니다.
base64 file.tar.gz > file.tar.gz.b64
ascii-xfr
이제 com send file 명령 이 내 연결 명령줄 인지 확인하세요.
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
모든 체크섬 명령으로 충분합니다. 금액이 일치하는지 수동으로 확인하면 이체가 성공한 것으로 간주할 수 있습니다!
답변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가 존재하기 전부터 Linux를 사용해 왔습니다.