ssh에 터미널을 할당하지 않으면 어떤 이점이 있습니까? 뭔가를 할 것입니다 ssh user@host sudo

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

ssh user@host sudo thing

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



답변

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

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


답변

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.

답변

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

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

답변

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

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

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


답변

보낸 사람 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가 필요합니다.