Computer >> 컴퓨터 >  >> 문제 해결 >> Linux

해결 방법: stdin이 터미널이 아니어서 의사 터미널이 할당되지 않는 오류

대부분의 경우 "pseudo-terminal will not be allocated because stdin is not a terminal"(stdin이 터미널이 아니기 때문에 의사 터미널이 할당되지 않습니다)이라는 혼란스러운 오류 메시지는 스크립트 내에서 SSH 명령을 실행할 때만 나타납니다. 흥미롭게도 동일한 명령을 명령줄에서 직접 실행하면 아무 문제 없이 정상적으로 작동하는 경우가 많습니다.

본격적인 문제 해결에 들어가기 전에 먼저 공개 키가 SSH 에이전트에 올바르게 등록되어 있는지 확인하고 ssh 명령을 다시 실행해 보세요. 단순히 키가 누락되어 발생한 문제일 수도 있습니다. 그래도 해결되지 않는다면 스크립트 자체를 점검해야 합니다.

방법 1: 의사 TTY 할당 강제 또는 비활성화

간단한 명령줄 옵션 몇 가지로 문제를 빠르게 해결할 수 있습니다. 의사 터미널(pseudo-terminal) 할당을 강제하려면 ssh -t -t -R 뒤에 기존에 사용하던 연결 옵션을 이어서 입력합니다. 예를 들어 ssh -p 80 appuals@ssh.example.com으로 example.com 계정에 로그인하려고 했다면(물론 example.com은 설명용 가상 주소입니다), 다음과 같이 실행해 보세요.

ssh -t -t -R -p 80 appuals@ssh.example.com

실제 환경에서는 자신의 계정명과 호스트명으로 바꿔야 한다는 점을 잊지 마세요. 이렇게 하면 터미널 할당이 강제로 이루어지므로 의사 터미널 관련 오류가 더 이상 나타나지 않아야 합니다.

다만 일부 사용자는 이 방법 적용 후 끝없이 오류 메시지가 반복 출력되는 경험을 하기도 합니다. 이런 경우에는 Ctrl+C를 눌러 프로세스를 종료하세요.

-t 스위치를 하나만 사용하거나 개수를 조절해 볼 수도 있습니다. 그래도 해결되지 않으면 -t 대신 -T 스위치로 바꿔 ssh -T -R -p 80 appuals@ssh.example.com처럼 실행해 보세요.

-T 옵션은 의사 터미널 할당 과정 자체를 완전히 비활성화합니다. 따라서 강제 할당이 실패하는 상황에서는 오히려 이 방법이 효과적일 수 있습니다. 물론 명령줄에서 직접 실행할 때는 이런 문제가 없지만, 스크립트에서 어떤 옵션이 작동했는지 기록해 두면 나중에 같은 서버에 접속하는 스크립트를 작성할 때 유용하게 활용할 수 있습니다.

ssh 명령은 이 두 가지 상반된 옵션에 비슷한 이름을 부여했으므로 헷갈리기 쉽습니다. -t는 의사 터미널 할당을 강제하고, -T는 할당을 비활성화한다는 점을 기억하세요. 두 옵션 모두 대소문자를 구분하며, ssh가 제대로 작동하려면 전통적인 TTY 터미널이 필요하기 때문에 스크립트 환경에서는 특히 중요합니다. 일반적인 경우라면 여러분은 터미널 에뮬레이터를 통해 이 역할을 대신하게 됩니다.

방법 2: sshpass 활용

스크립트 환경에서는 sshpass 명령이 더 잘 맞는 경우도 있습니다. sshpass는 기본적으로 포함되어 있지 않으므로, 필요하다면 sudo apt-get install sshpass(Debian/Ubuntu 계열) 또는 sudo yum install sshpass(RHEL/CentOS 계열)로 설치할 수 있습니다.

현재 sshpass를 사용하고 있지 않다면 굳이 도입할 필요는 없습니다. 하지만 이미 사용 중인 환경에서도 동일한 기법으로 의사 터미널 관련 오류 메시지를 해결할 수 있습니다.

예를 들어 스크립트 내에서 시스템이 정상 작동하도록 강제하려면 다음과 같이 실행합니다.

sshpass -p password ssh -T appuals@ssh.example.com

방법 3: 작업 관리(job control) 오류 해결

위의 문제들을 모두 해결한 후에도 가끔 추가적인 오류 메시지가 나타날 수 있습니다. "no access to tty"(TTY에 접근할 수 없음)라는 경고와 함께 셸에 작업 제어(job control) 기능이 없다는 안내가 표시될 수 있는데, 이 경우에도 대체로 평소와 같이 작업을 진행할 수 있습니다.

이 오류는 원격 서버의 csh, tcsh 또는 Almquist 셸 등에서 비정상적인 설정이 원인일 가능성이 높습니다. 다른 오류 메시지들에 가려져 미처 눈치채지 못했을 수 있지만, 의사 터미널 관련 오류가 더 이상 보이지 않는다면 평소처럼 작업을 계속할 수 있습니다.

다만 이 상황에서는 Ctrl+Z로 프로세스를 일시 중단하지 않는 것이 좋습니다. 작업 제어 기능이 없으면 중단된 프로세스를 다시 재개할 방법이 없을 수 있기 때문입니다. 종료 시 "there are stopped jobs"(중단된 작업이 있습니다)라는 오류가 나타나면 로그아웃조차 허용되지 않습니다.

이럴 때는 ps와 kill 명령을 사용해 종료되지 않은 작업을 강제로 닫아야 합니다. 작업 중인 데이터 손실을 감수할 수 있다면 이 방법으로 모든 작업을 정리한 후 정상적으로 로그아웃할 수 있습니다.