전송을 위해 SSH를 사용하는 동안 터미널 할당으로 인해 파일이 중단됩니다.

전송을 위해 SSH를 사용하는 동안 터미널 할당으로 인해 파일이 중단됩니다.

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

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

이것은 완벽하게 작동합니다. 그러나 강제 명령을 사용하는 동안 pty-allocation이 명령의 출력을 변경한다는 것을 알았습니다.

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)으로 변환합니다. 또한 (대부분의 사용자의 경우) 탭을 공백으로 변환합니다.

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

쉘은 추가 정보를 인쇄할 수도 있지만 단일 명령의 경우제안by @kba는 쉘이 일반적으로 전송하지 않기 때문에 오해의 소지가 있습니다.프롬프트, 언급된 것과 같은 SSH 컨트롤은 ~C다음에 적용됩니다.입력오히려산출.

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

답변2

pty 할당이 출력을 변경하는 이유는 무엇입니까?

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

SSH는 사용자가 원하는 것을 추측하기 위해 최선을 다하려고 합니다(stdin이 TTY가 아닌 경우 -tt스위치를 추가하지 않는 한 원격 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바이트에 불과하지만 더 많을 수도 있습니다(리눅스 줄 Newline은 이지만 \n터미널은 둘 다 가져옵니다 \r\n).

관련 정보