
나는 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
).