SSH를 사용하여 전송할 때 터미널 할당으로 인해 파일이 손상됨

SSH를 사용하여 전송할 때 터미널 할당으로 인해 파일이 손상됨

나는 다음 ssh을 사용하여 원격 파일의 압축을 풀곤 했습니다.

ssh host "cat file.tgz" | tar xf -

이것은 매우 잘 작동합니다. 그러나 force 명령을 사용할 때 pty 할당이 명령의 출력을 변경한다는 것을 알았습니다.

ssh host -T "cat file.tgz" >first_file
ssh host -t "cat file.tgz" >second_file

여기서 첫 번째 파일은 문제가 없지만 두 번째 파일이 손상되었습니다.

pty 할당으로 인해 출력이 변경되는 이유는 무엇입니까?

답변1

읽는 데 도움이 된다ssh매뉴얼 페이지:

 -T      Disable pseudo-tty allocation.                                     

 -t      Force pseudo-tty allocation.  This can be used to execute arbi‐    
         trary screen-based programs on a remote machine, which can be      
         very useful, e.g. when implementing menu services.  Multiple -t    
         options force tty allocation, even if ssh has no local tty.

당신이 그것을 말할 때분배하다의사 tty, 원격 측의 모든 프로세스는 연결이 "실제" 터미널임을 확인할 수 있으며 연결이 대화형이므로 추가 메시지가 전송됩니다. 셸 초기화 중에 를 사용하여 확인할 수 있는 터미널 모드도 설정합니다 stty -a. 터미널 모드는 다음 용도로 사용됩니다.번역하다키보드 입력과 호스트 사이, 호스트에서 터미널로 전송되는 텍스트 사이:

  • 아니요초기화되면 연결이 터미널이 아니므로 변환이 수행되지 않습니다.
  • 그리고초기화 중에 터미널은 \n줄 바꿈 문자( )를 캐리지 리턴 줄 바꿈 문자(0x0d, 0x0a)로 변환합니다. 또한 (대부분의 사용자의 경우) 탭을 공백으로 변환합니다.

설명된 효과는 다음과 같습니다.번역하다. 그게 없으면 당신의인터렉티브세션이 화면을 가로질러 "계단"되어 사용할 수 없게 됩니다.

쉘은 추가 정보를 인쇄할 수도 있지만 단일 명령의 경우제안쉘은 일반적으로 전송하지 않기 때문에 @kba는 오해의 소지가 있습니다.힌트, 위의 SSH 컨트롤은 ~C다음에 적용됩니다.입력하다대신에산출.

터미널에 실행되면 ssh는 연결을 닫을 때 메시지도 인쇄합니다. 그러나 이것은 표준 오류에 기록됩니다.

답변2

pty 할당으로 인해 출력이 변경되는 이유는 무엇입니까?

할당된 터미널이 있는 원격 측에서는 로컬 터미널에 제어 문자를 "주입"하기 때문입니다(기본적으로 C0 및 C1 제어 코드). 로컬 측은 터미널이 아니라 파일이므로 해당 파일에 덤프합니다.

-ttSSH는 사용자가 원하는 것을 추측하기 위해 최선을 다하고 있습니다(stdin이 TTY가 아닌 경우 스위치를 추가하지 않는 한 원격 TTY를 할당하지 않습니다 ). 이 옵션이 존재하는 이유는 바이너리 전송을 원할 경우 터미널이 파일을 망가뜨리는 것을 원하지 않기 때문입니다.

작은 파일을 전송한 다음 16진수 덤프를 통해 이 동작을 확인할 수 있습니다.

$ ssh -t host "cat test" > /tmp/test.t
$ ssh host "cat test" > /tmp/test
$ hexdump -C /tmp/test
00000000  0a 2a 20 46 72 69 20 46  65 62 20 31 32 20 32 30  |.* Fri Feb 12 20|
00000030  6d 3e 20 33 2e 34 2e 31  2d 31 0a 2d 20 4e 65 77  |m> 3.4.1-1.- New|

$ hexdump -C /tmp/test.t
00000000  0d 0a 2a 20 46 72 69 20  46 65 62 20 31 32 20 32  |..* Fri Feb 12 2|
00000030  6f 6d 3e 20 33 2e 34 2e  31 2d 31 0d 0a 2d 20 4e  |om> 3.4.1-1..- N|

나에게 차이점은 0d 0a각 줄 바꿈 앞의 2바이트에 불과하지만 그 이상이 있을 수 있습니다(리눅스 줄은 줄 바꿈 전용이지만 \n터미널은 둘 다 가져옵니다 \r\n).

관련 정보