최상의 답변
터미널에서 프로그램을 실행하면 프로그램을 일괄 작업으로 실행할 때없는 추가 기능이 제공됩니다. 예를 들어, 터미널에서 프로세스를 실행하는 경우 Ctrl + C를 눌러 중단 할 수 있지만 프로세스가 터미널과 연결되지 않은 경우 Ctrl + C로 중단 할 수 없습니다. kill
또는 이와 유사한 것을 실행합니다. 터미널에 대해서는이 답변에서 자세히 설명합니다.
원격 sshd
프로세스는 키보드와 화면의 역할을 맡기 위해 의사 터미널 쌍을 사용합니다. 원격 프로세스가 /dev/tty1
와 같은 “true”터미널에서 읽는 경우 키보드에서 바로 입력을받습니다. 대신 sshd
프로세스는 키 입력을 의사 터미널의 마스터 끝에 기록하여 원격 프로세스에 전달합니다. 실행중인 프로그램은 마치 키보드에서 오는 것처럼 의사 터미널의 슬레이브 끝에서 데이터를 수신합니다. 마찬가지로 프로세스가 의사 터미널의 슬레이브 끝에 쓸 때, 그것은 마치 “화면에 문자를 인쇄하는”진정한 “터미널에 쓰기. 그러나 대신 sshd
는 마스터 측에 기록 된 데이터를 읽고 암호화 한 다음 유선을 통해 다시 사용자에게 보냅니다.
터미널없이 일어나는 일을 확인하려면 , ssh -T remote.host
와 같은 것을 실행 해보십시오. 원격 호스트에서 쉘을 시작하지만, 쉘은 터미널이 없기 때문에 프롬프트를 출력하지 않고 배치 모드에서 실행되고 있다고 생각합니다. 또한 sudo
는 암호를 읽는 대신 터미널에 입력해야하기 때문에 원격 호스트에서 sudo
를 실행할 수 없습니다. 표준 입력에서 가져옵니다.
기본적으로 원격 sshd
는 명령을 지정하지 않은 경우에만 pty를 할당합니다. ssh remote.host screen
를 시도하면 “명령을 지정하면 pty 할당이 억제되고”다시 문제가 발생한다는 것을 알 수 있습니다. 이를 방지하려면 -t
옵션을 지정하면 원격 sshd
가 항상 터미널 할당을 시도합니다.
… ssh
가 파일에서 읽는 경우와 같이 통신 할 로컬 끝에 터미널이없는 경우. 이 경우 ssh -t -t
를 사용하여 pty 할당을 강제 할 수 있습니다. 원격 끝은 마치 키보드에서 입력 한 것처럼 ssh
“의 표준 입력에 기록 된 모든 바이트에 반응하기 때문에 의도하지 않은 결과가 발생할 수 있습니다. 예를 들어, Ctrl + C at 키보드는 ASCII 코드 3을 생성하므로 로컬 ssh
가 입력 파일에서 값 3을 가진 바이트를 읽어야하는 경우이를 원격 호스트로 전달합니다. 원격 sshd
는이를 pty의 마스터 끝에 쓰고 커널은 SIGINT를 슬레이브 끝에서 읽는 프로세스로 보냅니다. 터미널은 흥미로운 생물입니다.