ssh 클라이언트의 인수 뒤에 대화식 프로그램이있을 때 sshd가 의사 터미널을 사용하지 않는 이유는 무엇입니까?


11

SSH 서버에 연결하는 일반적인 방법은 ssh username@ip_address입니다. 그러나 사용자는 원격 시스템에서만 프로그램을 실행하려고 할 수 있습니다. 따라서 프로그램 이름은 일반 인수 다음에옵니다 ssh username@ip_address <program_name>. 예를 들면 다음과 같습니다 ssh username@ip_address ls. 대화식 프로그램 (사용자 입력을 수용하고 출력을 제공하는 것)을 제외하고는 그 주장이 top좋습니다. 출력은

TERM 환경 변수가 설정되지 않았습니다.

이것은 sshd와 최상위 프로그램 사이에 (의사) 터미널이 연결되어 있지 않음을 의미합니다. 해결책은 -t이제 전체 명령이되는 인수를 추가 하는 것 ssh -t username@ip_address top입니다.

내 질문은 왜 기본적으로 sshd가 의사 터미널을 사용하여 비 대화 형 프로그램과 통신 할 수 없으므로 대화 형 프로그램에 대한 -t인수 를 추가 할 필요가 없다는 것입니다 .


3
짧은 대답은 "보통 원하는 것이 아니기 때문"입니다.
Celada

나는 본질적으로 의견을 구걸하거나 그립을 만들기 위해 귀하의 질문이 완화 될 것으로 예상합니다. 그러나 ssh가 왜 대다수의 경우 필요하지 않을 때 tty 자원을 할당해야합니까? REAL 질문은 왜 구성 옵션을 강제로 할당하지 않아 기본 또는 호스트 특정 기본값으로 만들 수 있습니까?
Otheus

@Otheus 그것은 이다 설정 옵션을 선택합니다. 구성에서 RequestTTY yes(또는 force)을 설정할 수 있습니다 .
Jakuje

어. 6에 소개 된 것으로 보이나 얼마 지나지 않아 버그가있는 것 같습니다. 아주 오래된 배포판 만 사용합니다. :)
Otheus

6
SSH가 프로그램이 대화식이라는 것을 어떻게 확실하게 알 수 있습니까? top배치 모드 에서도 실행할 수 있습니다.
muru

답변:


18

다른 사람들이 말했듯이 PTY에는 특정 오버 헤드가 있지만 원격 명령을 실행할 때 PTY를 사용하지 않는 가장 큰 이유는 정보를 잃기 때문입니다.

일반적으로 ssh를 통해 원격으로 명령을 실행하면 명령 stdoutstderr스트림이 로컬 stdout및 로 전송되므로 stderr개별적으로 경로 재 지정 / 파이프 할 수 있습니다.

$ ssh server ls foo bar
ls: cannot access bar: No such file or directory
foo
$ ssh server ls foo bar > stdout 2> stderr
$ cat stdout
foo
$ cat stderr
ls: cannot access bar: No such file or directory

그러나 PTY를 사용하는 경우 PTY에는 stdout출력 / 오류에 대한 별도의 스트림이 없으므로 모든 출력은로 이동합니다 .

$ ssh -t server ls foo bar > stdout 2> stderr
$ cat stdout
ls: cannot access bar: No such file or directory
foo
$ cat stderr
$

이것은 내가 알지 못하는 좋은 점입니다.
Jakuje

1
@ThomasDickey : 거의 ... 문제는 "개발자가이 기본값을 선택한 이유는 무엇입니까?"가 아니라 " sshd가 기본적으로 의사 터미널을 사용할 수없는 이유 "입니다. 문구는 질문에서 어느 정도 직접적입니다). 따라서 행동의 차이 (많은 스크립팅 관용구를 깰 것)는 개발자가 어떻게 선택했는지에 관계없이 관련이 있습니다
psmears

2
@ThomasDickey : 질문을 읽었 습니까? 개발자의 의견은 어디에 언급되어 있습니까?
psmears

1
+1 은 성능을 제외한 pty를 사용 하지 않는 특별한 이점을 나타냅니다 . 당신은 여전히 -t이것이 기본값이어야 한다고 주장 할 수 있으며, 그것을 끄는 데 필요한 옵션이므로 실제로 작은 성능 이점은 중요하지 않은 경우 나에게 가장 의미가 있습니다.
Peter Cordes

7

매뉴얼 페이지에서이를 ssh설명합니다.

서버가 사용자 ID를 승인하면 서버 는 비 대화식 세션에서 지정된 명령을 실행 하거나 명령이 지정되지 않은 경우 머신에 로그인하여 사용자에게 대화식 세션으로 일반 쉘을 제공합니다 . 원격 명령 또는 셸과의 모든 통신은 자동으로 암호화됩니다.

그것은 특징이며 아마도 역사적 rsh행동의 원인 때문일 것입니다 . 꽤 합리적입니다. 대부분의 명령은 실제로 대화식이 아니며 PTY를 할당하는 무료 작업이 아닙니다 (20 년 전보다 중요 함).


리소스 문제는 그럴듯하지만 rsh해당 프로그램에 해당하는 옵션이 없기 때문에 이에 대한 의견 이 모호합니다.
Thomas Dickey

@ThomasDickey 내가 사용한 적이 rsh있지만, 확실히 약간의 영향은없는 옵션에서, 그러나의 행동, 거기가 rshrlogin(이 명령하거나하지 않은 경우). rsh를 사용하여 대화식 명령 (예 : rogue (6) 또는 vi (1))을 실행할 수 없습니다. 대신 rlogin (1)을 사용하십시오. .
Jakuje

1

어떻게 ssh당신이 호출하는 명령이 대화 형인지 아닌지 말할 생각?

비 유닉스 운영 체제를 실행하는 컴퓨터에 로그인 할 수 있다는 사실을 알면이 악몽이 더 악화됩니다.

하나의 사례가 기본값이어야하는 쉬운 해결책이 없었습니다.


모릅니다. 알 수 없습니다. 따라서 이러한 상황에서의 동작을 설명하는 매뉴얼 페이지가 있습니다.
Jakuje
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.