ssh에 터미널을 할당하지 않으면 어떤 이점이 있습니까?


66

가끔씩 나는 뭔가를 할 것입니다

ssh user@host sudo thing

그리고 ssh는 기본적으로 의사 tty를 할당하지 않는다는 것을 상기시킵니다. 왜 그렇지 않습니까? 별명 ssh을 지정하면 어떤 이점이 없어 ssh -t집니까?


1
> ssh가 psuedo-tty를 할당하지 않는다는 것을 상기시킵니다. 어떻게됩니까? 문제가 무엇인지 이해하기 위해 질문을 풍부하게 할 것입니다.
Air

5
@Air 수정하려고했던 문제가 없습니다. 내가 이해하려고하는 ssh가 어떻게 구현되는지에 대한 선택이있었습니다. 질문은 매우 명확하며 Andrew B의 답변은 질문을 훌륭하게 해결합니다. 대답은 다음과 같이 요약 할 수 있습니다. 실행은 ssh -t항상 좋지 않습니다. 일부 명령이 이상한 방식으로 중단 될 수 있기 때문입니다. 반면에 PTY가 필요없는 명령을 실행하면 터미널이 필요하다는 오류 메시지가 나타납니다.
Chas. Owens

답변:


73

가장 큰 차이점은 상호 작용 의 개념입니다 . 스크립트 내에서 로컬로 명령을 실행하는 것과 직접 입력하는 것과 비슷합니다. 원격 명령이 기본값을 선택해야하고 비대화식이 가장 안전하다는 점이 다릅니다. (보통 가장 정직한)

STDIN

  • PTY가 할당 된 경우 응용 프로그램은이를 감지하여 사용자에게 아무런 영향을주지 않으면 서 추가 입력을 요구하는 것이 안전하다는 것을 알 수 있습니다. 터미널이없는 경우 사용자에게 입력하라는 메시지를 표시하는 단계를 건너 뛰는 많은 프로그램이 있으며 이는 좋은 것입니다. 그렇지 않으면 스크립트가 불필요하게 중단됩니다.
  • 명령이 진행되는 동안 입력 내용이 원격 서버로 전송됩니다. 여기에는 제어 순서가 포함됩니다. 잠시 Ctrl-c휴식 일반적으로 ssh 명령에 루프를 즉시 중단시킬 것입니다, 당신의 제어 시퀀스 대신 원격 서버로 전송됩니다. 결과적으로 제어 가 ssh 명령을 떠날 때 , 그러나 다음 ssh 명령이 시작되기 전에 키 입력을 "해머"해야 합니다.

나는 ssh -t크론과 같은 무인 스크립트 에서 사용하지 않도록 주의 할 것 입니다. 원격 명령이 입력을 위해 대화식으로 동작하도록 요구하는 비 대화식 쉘은 모든 종류의 문제를 요구합니다.

자신의 쉘 스크립트에 터미널이 있는지 테스트 할 수도 있습니다. 최신 버전의 bash로 STDIN을 테스트하려면 다음을 수행하십시오.

# fd 0 is STDIN
[ -t 0 ]; echo $?

STDOUT

  • 에 별칭 ssh을 지정 하면 ssh -t줄 끝에서 추가 캐리지 리턴을 얻을 수 있습니다. 그것은 당신에게 보이지 않을 수도 있지만 거기에 있습니다. ^M배관 할 때 와 같이 나타납니다 cat -e. 그런 다음 특히이 출력을 데이터베이스에 삽입하려는 경우이 제어 코드가 변수에 지정되지 않도록 추가 노력을 기울여야합니다.
  • 또한 프로그램이 파일 리디렉션에 적합하지 않은 출력을 렌더링 할 수 있다고 가정 할 위험이 있습니다. 일반적으로 STDOUT을 파일로 경로 재지 정하는 경우 프로그램은 STDOUT이 터미널이 아님을 인식하고 색상 코드를 생략합니다. STDOUT 경로 재 지정이 ssh 클라이언트 의 출력에서 ​​발생하고 클라이언트 의 원격 끝과 연관된 PTY가있는 경우, 원격 프로그램은 그러한 구별을 수행 할 수 없으며 출력 파일에서 터미널 가비지가 생깁니다. 연결 의 원격 끝에 있는 파일로 출력 경로 재 지정 은 여전히 ​​예상대로 작동해야합니다.

다음은 이전과 동일한 bash 테스트이지만 STDOUT에 대한 것입니다.

# fd 1 is STDOUT
[ -t 1 ]; echo $?

이러한 문제를 해결할 수는 있지만 필연적으로이 문제를 해결하는 스크립트를 디자인하는 것을 잊어 버리게됩니다. 우리 모두는 어느 시점에서합니다. 팀 구성원은 / 실현이 별칭이 때 다시 당신을 위해 문제를 야기 할 장소에 있음을 기억하지 않을 수 있습니다 그들이 당신의 별칭을 사용하는 스크립트를 작성합니다.

앨리어싱 sshssh -t매우 당신의 설계 원칙에 위배됩니다 경우입니다 적어도 놀람 ; 사람들은 예상치 못한 문제에 직면하게되며 그 원인을 이해하지 못할 수 있습니다.


9
이 작업을 수행 한 팀에서 일한 것에 대한 인상을 거의 얻었습니다.
Andrew B

이 답변에서 다루는 범위에서 훌륭합니다. 그러나 질문은 더 넓은 범위를 가졌으며 본질적으로 모든 차이점 (예상 사항)을 알고 싶어했습니다. 추가 정보 : 프로세스 레벨에서 -t는 먼저 tty를 할당 한 다음 쉘을 실행하고 (/ etc / profile 및 ~ / .bash_profile을 소싱 함) 명령을 실행합니다. -t가 없으면 ssh는 다른 env 파일 (/etc/bash.bashrc, ~ / .bashrc)을 INSTEAD하고 INNAD 명령을 실행합니다. 이것은 당신이 각각 매우 다른 행동을 볼 수 있음을 의미합니다 : 더 짧은 $ PATH, 아마도 당신이 생각한 ENV 변수가 없기 때문에 bash 'unary'오류 일 것입니다.
Scott Prive

@Crossfit 우리는 다른 답변에 대한 의견으로 로그인 쉘과 비 쉘의 주제를 다루었지만 OP는 이미 특정 요구에 대한 질문에 대한 답변을 고려했기 때문에 환경 적 차이를 철저히 분석하지 않았습니다. 이 Q & A에 참여하는 다른 사람들에게 도움이 될 수 있도록 방을 볼 수있는 부분을 자유롭게 추가하십시오.
Andrew B

33

SSH 이스케이프 문자 및 이진 파일 전송

다른 답변에서 언급되지 않은 한 가지 장점 은 의사 터미널없이 작동 할 때 SSH 이스케이프 문자 ( 예 : SSH 이스케이프 문자 ) ~C지원되지 않는다는 것입니다 . 이렇게하면 프로그램이이 시퀀스를 포함 할 수있는 이진 파일을 안전하게 전송할 수 있습니다.

개념의 증거

의사 터미널을 사용하여 이진 파일을 복사하십시오.

$ ssh -t anthony@remote_host 'cat /usr/bin/free' > ~/free
Connection to remote_host closed.

의사 터미널을 사용하지 않고 이진 파일을 복사하십시오.

$ ssh anthony@remote_host 'cat /usr/bin/free' > ~/free2

두 파일이 동일하지 않습니다 :

$ diff ~/free*
Binary files /home/anthony/free and /home/anthony/free2 differ

의사 터미널로 복사 한 것이 손상되었습니다.

$ chmod +x ~/free*
$ ./free
Segmentation fault

다른 하나는 아닙니다 :

$ ./free2
             total       used       free     shared    buffers     cached
Mem:       2065496    1980876      84620          0      48264    1502444
-/+ buffers/cache:     430168    1635328
Swap:      4128760        112    4128648

SSH를 통한 파일 전송

이것은 데이터 전송을 위해 SSH를 사용 scp하거나 이와 같은 프로그램에 특히 중요합니다 rsync. SCP 프로토콜의 작동 방식에 대한자세한 설명은 SCP 프로토콜 이 텍스트 프로토콜 메시지와 이진 파일 데이터로 구성되는 방식을 설명합니다.


OpenSSH는 자신을 보호합니다

-t플래그가 사용 되더라도 OpenSSH ssh클라이언트는 stdin스트림이 터미널이 아님을 감지하면 의사 터미널 할당을 거부합니다 .

$ echo testing | ssh -t anthony@remote_host 'echo $TERM'
Pseudo-terminal will not be allocated because stdin is not a terminal.
dumb

여전히 OpenSSH 클라이언트가 -tt다음 과 같이 의사 터미널을 할당하도록 할 수 있습니다 .

$ echo testing | ssh -tt anthony@remote_host 'echo $TERM'
xterm

어느 쪽이든, 그것은 (의식적으로) stdout또는 stderr리디렉션 되는지 신경 쓰지 않습니다 .

$ ssh -t anthony@remote_host 'echo $TERM' >| ssh_output
Connection to remote_host closed.

2
그것은 내가 생각하지 않은 매우 흥미로운 점이었습니다.이 답변을 추가 해 주셔서 감사합니다!
Jenny D

4

원격 호스트에서이 설정과 관련이 있습니다.

/etc/sudoers
...
Defaults requiretty

sudo없이

$ ssh -T user@host echo -e 'foo\\nbar' | cat -e
foo$
bar$

그리고 sudo와 함께

$ ssh -T user@host sudo echo -e 'foo\\nbar' | cat -e
sudo: sorry, you must have a tty to run sudo

sudo를 사용하면 추가 캐리지 리턴을 얻습니다.

$ ssh -t user@host sudo echo -e 'foo\\nbar' | cat -e
foo^M$
      bar^M$
            Connection to localhost closed.

해결책은 다음을 사용하여 줄 바꿈을 캐리지 리턴 줄 바꿈으로 변환하는 것 입니다.stty -onlcr

$ ssh -t user@host stty -onlcr\; sudo echo -e 'foo\\nbar' | cat -e
foo$
    bar$
        Connection to localhost closed.

1
멋지지만 출력이 들여 쓰기 / : 자동 캐리지 리턴 (유닉스와 같은)을 할 수 있는지 알고 있습니까?
Boop

1

이전 버전과의 호환성에 대해 생각하십시오.

사람들은의 정확한 기능 있었기 때문에 SSH의 2 개 차 모드는 청각 장애없이 청각 장애와 상호 작용 - 로그인 및 지정된-명령입니다 rloginrsh각각. ssh 는 대체 기능을 성공적으로 수행 하기 위해 수퍼 세트 rlogin/ rsh기능을 제공해야했습니다.

그래서 기본값은 ssh가 태어나 기 전에 결정되었습니다. "나는 명령을 지정 싶어 같은 조합 청각 장애를 얻을 수는"새로운 옵션으로 액세스 할 수 있도록했다. 우리가 사용할 때와 달리 적어도 지금 그 옵션 을 가지고 있음을 기쁘게 생각합니다 rsh. 우리는 암호화 된 연결을 얻기 위해 유용한 기능을 교환하지 않았습니다. 보너스 기능이 있습니다!


0

보낸 사람 man ssh:

 -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.

이를 통해 원격 서버에 일종의 "쉘"을 얻을 수 있습니다. 셸 액세스는 허용 하지 않지만 SSH를 허용 하는 서버 (예 : Github는 SFTP 액세스의 알려진 예)의 경우이 플래그를 사용하면 서버가 연결을 거부하게됩니다.

쉘에는 또한 (와 같은 $PATH) 모든 환경 변수가 있으므로 스크립트를 실행하려면 일반적으로 tty가 필요합니다.


1
이것은 질문에 대답하지 않습니다. pseudo-tty를 할당하는 방법을 이미 알고 있습니다. 왜 항상 하나만 할당해서는 안되는지 알고 싶습니다.
Chas. Owens

1
@ Chas.Owens 답변에서 지적했듯이 일부 SSH 서버는 tty 액세스를 허용 하지 않으며 서버에서 요청하면 연결이 끊어집니다.
Nathan C

5
일부 용어가 혼동 될 수 있습니다. 단순히 PTY와 관련되어 있기 때문에 쉘이 아닙니다. 일반적으로 셸 유형에는 , 및 non-interactive, 세 가지가 있습니다. 다른 두 쉘 유형의 추가 특성입니다. 이 세 가지의 순열은 로그인시 어떤 파일이 소스로 제공되는지를 결정하며, 이는 환경 초기화 방법에 영향을줍니다. (당신이 언급 한대로 변수들)interactiveloginlogin
Andrew B

3
@AndrewB 당신이 맞아요 ...이 질문에서 무언가를 배웠습니다. :)
Nathan C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.