직렬 콘솔 (터미널 서버를 통한 텔넷을 통한) 만 있으면 호스트 안팎으로 파일을 전송하는 데 어떤 방법을 사용할 수 있습니까?
잘라 내기 / 붙여 넣기는 작은 / 인쇄 가능한 물건에 작동하며 나는 uuencode / uudecode (gzip과 함께)가 인쇄 할 수없는 핸들을 처리하여 재생했지만 모두 매우 제한적입니다.
직렬 콘솔 (터미널 서버를 통한 텔넷을 통한) 만 있으면 호스트 안팎으로 파일을 전송하는 데 어떤 방법을 사용할 수 있습니까?
잘라 내기 / 붙여 넣기는 작은 / 인쇄 가능한 물건에 작동하며 나는 uuencode / uudecode (gzip과 함께)가 인쇄 할 수없는 핸들을 처리하여 재생했지만 모두 매우 제한적입니다.
답변:
연결의 다른 쪽 끝에서 사용할 직렬 콘솔 프로그램 ¹은 파일을 원격으로 보낼 수있는 방법이 있습니다. 정확히 어떻게 진행하는지는 원격 시스템에서 사용 가능한 리소스에 따라 다릅니다.
나는 lrzsz
또는 kermit
원격쪽에
솔리드 바이너리 파일 전송 프로그램과 같은 원격 측에 설치되어있는 경우 가장 쉬운 경우는 lrzsz
나 kermit
. 이것은 오늘날보다 한 번 더 흔했지만 특정 시스템에는 여전히이 중 하나가있을 수 있습니다.
로컬에서 사용하는 직렬 콘솔 프로그램에는 Zmodem 또는 Kermit 업로드를 수행 할 수있는 방법이 거의있어 필요한 모든 것을 직접 보낼 수 있습니다.
Zmodem의 경우 rz
원격 시스템에서 입력 하면 로컬 직렬 터미널이 이해해야하는 특수 문자열이 전송되어 파일 선택기 대화 상자가 나타납니다.
커밋은 더 간단한 프로토콜이므로이 경우 수동으로 전송을 시작해야합니다.
나는 할 일이 이진 파일 전송 프로그램을 가지고,하지만 난 할 일이 없습니다 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
하고 위의 기술을 사용하여 원격 시스템으로 보낼 수 있습니다.
각주 :
minicom , picocom , PuTTY , VanDyke CRT ...
입력 파일 이름을이 버전의 uuencode
두 번, 한 번 입력 데이터 소스의 이름을 지정하고 원격 시스템이 데이터를 출력 파일로 디코딩 할 때 파일을 호출해야하는 대상을 다시 선언해야합니다. 원격 시스템의 출력 파일 이름이 다를 수 있습니다.
로컬 버전 uuencode
이 다르게 작동 할 수 있습니다.
기본적으로 직렬 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
있지만 체크섬 명령으로 충분합니다. 합계가 일치하는지 수동으로 확인하면 전송이 완료된 것으로 가정 할 수 있습니다!
\r\n
또는 \n
길을 따라 "고정"된 경우에도 둘 다 작동합니다. 그것이 base64 표준이나 내가 사용한 도구에 불과하다면 손을 떠올리지는 않지만 실제로 표준 동작이라고 생각합니다.
아마도 당신은 minicom 을 시도 해야합니다 .
직렬 콘솔 만 있으면 작동하는지 알 수 없지만 네트워크 액세스 권한이 있으면 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
)를 복사 하여 대상 호스트의 인증 된 키 파일에 추가했습니다.
파일 전송 프로그램의 조부모 인 kermit 을 사용 합니다. 우리는 이미 리눅스가 있기 오래 전에 그것을 사용했습니다.