ssh -t 옵션이 리디렉션 출력에 cr 및 lf를 추가하는 이유는 무엇입니까?

ssh -t 옵션이 리디렉션 출력에 cr 및 lf를 추가하는 이유는 무엇입니까?

나는 Windowsbox에서 Linux Box로 연결하기 위해 퍼티를 사용합니다. 그 후에 나는 다음을 수행합니다.

서버 A에서:

serverA: file /etc/motd
/etc/motd: : ASCII English text

서버 B에서:

serverB: ssh -t user@serverA "cat /etc/motd" > /etc/motd.serverA
serverB: file /etc/motd.serverA
/etc/motd.serverA:  ASCII text, with CRLF line terminators

이제 리디렉션된 출력에 CR 및 LF가 있는 이유는 무엇입니까? 이는 ssh에 -t 옵션을 사용할 때만 발생합니다. SSH 로그인에서 명령을 실행하기 위해 sudo를 사용해야 하는 경우 -t가 필요합니다. 예를 들어:

serverB: ssh -t user@serverA "sudo cat /etc/shadow" > /etc/shadow

제안해 주셔서 감사합니다.

답변1

TTY 설정을 확인하세요.

$ ssh -t somewhere 'stty -a' | grep cr
iflags: -istrip icrnl -inlcr -igncr -iuclc ixon -ixoff ixany imaxbel
oflags: opost onlcr -ocrnl -onocr -onlret -olcuc oxtabs -onoeot
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -mdmbuf

ssh -t이는 다양할 수 있지만 여기에는 기본적으로 " igncrCR 무시"가 입력 및 onlcr설정된 출력(NL을 CR-NL에 매핑)에 대해 비활성화되어 있고 CR이 삭제되거나 생략되지 않음을 보여줍니다 . 이러한 용어는 매뉴얼에서 찾아보거나 stty(1)볼 수 있습니다 termios(4)(리눅스는 다른 매뉴얼 섹션에 해당 용어를 넣을 수도 있습니다).

이러한 설정은 수정될 수도 있습니다(그러나 이로 인해 onlcr어떤 이유로든 설정해야 하는 사항이 중단될 수 있습니다).

$ ssh -t somehost 'stty onlcr; cat /etc/motd' > x ; file x
x: ASCII English text, with CRLF line terminators
$ ssh -t somehost 'stty -onlcr; cat /etc/motd' > x ; file x
x: ASCII English text
$ 

(의사)tty CR/NL 처리로 인해 파일 내용이 변경될 위험을 제거하려면 데이터를 사용 scp하거나 복사하는 것이 더 현명할 것입니다 .sftp

답변2

ssh 세션이 pseudo-tty 할당을 수행하도록 강제하는 데 사용하는 옵션을 사용하면 -tSTDOUT이 라인 버퍼링됩니다. 간단히 말해서 쉘은 지시받은 내용에 따라 대화형 터미널을 사용하고 있다고 가정하기 때문입니다.

따라서 출력은 대화형 터미널에서 의미 있는 방식으로 전달됩니다. 해당 셸에서 수행 중인 작업과 환경이 어떻게 설정되어 있는지에 따라 데이터를 더 자세히 살펴보면 색상 코드를 볼 수도 있고 다음과 같이 보일 수도 있습니다 [^[0;32m].

Sudo는 비밀번호를 요청하도록 설계된 애플리케이션이므로 TTY가 필요합니다. a) STDOUT에 대한 비밀번호를 입력하도록 요구하고 b) STDIN에 제공한 입력이 STDOUT에 표시되지 않도록 마스킹하여 터미널 기능에 영향을 주기를 바랍니다.

따라서 sudo는 출력을 예상 -t하고 -t라인 버퍼링하므로 STDOUT으로 전달되지 않고 일반적으로 터미널 자체에서 해석되는 추가 제어 문자를 볼 수 있습니다.

답변3

dos2unix 유틸리티를 사용하면 구성 변경을 피할 수 있습니다. 나는 이 방법을 사용했는데 그것은 나에게 효과적이었습니다.

remote_hostname=`ssh -t ${sys_ip} 'uname -n'|dos2unix`

관련 정보