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

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

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대화형 프로그램에 매개변수를 추가할 필요가 없는 이유입니다.

답변1

예, 다른 사람들이 말했듯이 PTY에는 약간의 오버헤드가 있습니다. 그러나 원격 명령을 실행할 때 PTY를 사용하지 않는 가장 큰 이유는 정보를 잃어버리기 때문입니다.

일반적으로 ssh를 통해 원격으로 명령을 실행하면 명령 stdoutstderr스트림이 localhost로 전송됩니다 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

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

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

답변2

매뉴얼 페이지에서는 ssh다음과 같이 설명합니다.

서버가 사용자의 신원을 승인하면 서버는 다음 중 하나를 수행합니다.비대화형 세션에서 주어진 명령을 실행합니다.또는,명령이 지정되지 않은 경우 시스템에 로그인하고 사용자에게 대화형 세션으로 일반 쉘을 제공합니다.. 원격 명령 또는 셸과의 모든 통신은 자동으로 암호화됩니다.

이것은 특성이며 행동의 역사적 원인으로 인해 발생할 수 있습니다 rsh. 이것은 매우 합리적입니다. 대부분의 명령은 실제로 대화형이 아니며 PTY 할당은 무료 작업이 아닙니다(20년 전에는 이것이 더 중요했습니다).

답변3

ssh호출하는 명령이 대화형인지 어떻게 알 수 있나요 ?

UNIX가 아닌 운영 체제를 실행하는 컴퓨터에 로그인했을 수 있다는 사실을 알게 되면 이러한 악몽은 더욱 악화됩니다.

쉬운 해결책은 없으며 한 가지 상황을 기본값으로 채택해야 합니다.

관련 정보