가끔씩 나는 뭔가를 할 것입니다
ssh user@host sudo thing
그리고 ssh는 기본적으로 의사 tty를 할당하지 않는다는 것을 상기시킵니다. 왜 그렇지 않습니까? 별명 ssh
을 지정하면 어떤 이점이 없어 ssh -t
집니까?
ssh -t
항상 좋지 않습니다. 일부 명령이 이상한 방식으로 중단 될 수 있기 때문입니다. 반면에 PTY가 필요없는 명령을 실행하면 터미널이 필요하다는 오류 메시지가 나타납니다.
가끔씩 나는 뭔가를 할 것입니다
ssh user@host sudo thing
그리고 ssh는 기본적으로 의사 tty를 할당하지 않는다는 것을 상기시킵니다. 왜 그렇지 않습니까? 별명 ssh
을 지정하면 어떤 이점이 없어 ssh -t
집니까?
ssh -t
항상 좋지 않습니다. 일부 명령이 이상한 방식으로 중단 될 수 있기 때문입니다. 반면에 PTY가 필요없는 명령을 실행하면 터미널이 필요하다는 오류 메시지가 나타납니다.
답변:
가장 큰 차이점은 상호 작용 의 개념입니다 . 스크립트 내에서 로컬로 명령을 실행하는 것과 직접 입력하는 것과 비슷합니다. 원격 명령이 기본값을 선택해야하고 비대화식이 가장 안전하다는 점이 다릅니다. (보통 가장 정직한)
Ctrl-c
휴식 일반적으로 ssh 명령에 루프를 즉시 중단시킬 것입니다, 당신의 제어 시퀀스 대신 원격 서버로 전송됩니다. 결과적으로 제어 가 ssh 명령을 떠날 때 , 그러나 다음 ssh 명령이 시작되기 전에 키 입력을 "해머"해야 합니다.나는 ssh -t
크론과 같은 무인 스크립트 에서 사용하지 않도록 주의 할 것 입니다. 원격 명령이 입력을 위해 대화식으로 동작하도록 요구하는 비 대화식 쉘은 모든 종류의 문제를 요구합니다.
자신의 쉘 스크립트에 터미널이 있는지 테스트 할 수도 있습니다. 최신 버전의 bash로 STDIN을 테스트하려면 다음을 수행하십시오.
# fd 0 is STDIN
[ -t 0 ]; echo $?
ssh
을 지정 하면 ssh -t
줄 끝에서 추가 캐리지 리턴을 얻을 수 있습니다. 그것은 당신에게 보이지 않을 수도 있지만 거기에 있습니다. ^M
배관 할 때 와 같이 나타납니다 cat -e
. 그런 다음 특히이 출력을 데이터베이스에 삽입하려는 경우이 제어 코드가 변수에 지정되지 않도록 추가 노력을 기울여야합니다.다음은 이전과 동일한 bash 테스트이지만 STDOUT에 대한 것입니다.
# fd 1 is STDOUT
[ -t 1 ]; echo $?
이러한 문제를 해결할 수는 있지만 필연적으로이 문제를 해결하는 스크립트를 디자인하는 것을 잊어 버리게됩니다. 우리 모두는 어느 시점에서합니다. 팀 구성원은 / 실현이 별칭이 때 다시 당신을 위해 문제를 야기 할 장소에 있음을 기억하지 않을 수 있습니다 그들이 당신의 별칭을 사용하는 스크립트를 작성합니다.
앨리어싱 ssh
에 ssh -t
매우 당신의 설계 원칙에 위배됩니다 경우입니다 적어도 놀람 ; 사람들은 예상치 못한 문제에 직면하게되며 그 원인을 이해하지 못할 수 있습니다.
다른 답변에서 언급되지 않은 한 가지 장점 은 의사 터미널없이 작동 할 때 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를 사용 scp
하거나 이와 같은 프로그램에 특히 중요합니다 rsync
. SCP 프로토콜의 작동 방식에 대한 이 자세한 설명은 SCP 프로토콜 이 텍스트 프로토콜 메시지와 이진 파일 데이터로 구성되는 방식을 설명합니다.
-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 개 차 모드는 청각 장애없이 청각 장애와 상호 작용 - 로그인 및 지정된-명령입니다 rlogin
및 rsh
각각. 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가 필요합니다.
non-interactive
, 세 가지가 있습니다. 다른 두 쉘 유형의 추가 특성입니다. 이 세 가지의 순열은 로그인시 어떤 파일이 소스로 제공되는지를 결정하며, 이는 환경 초기화 방법에 영향을줍니다. (당신이 언급 한대로 변수들)interactive
login
login