비대화형 비로그인 쉘은 이해하기 쉽습니다. 간단히 터미널에서 쉘 스크립트를 실행하면 쉘 스크립트를 실행할 비대화형 비로그인 쉘이 시작됩니다.
그러나 비대화형 로그인 쉘이 어떻게 작동하는지 이해하지 못합니다. 쉘이 비대화형이면 쉘을 실행하는 동안 로그인 자격 증명을 입력할 수 없으므로 로그인 자격 증명을 쉘 스크립트 등에 입력합니까?
답변1
나는 UNIX 시스템의 내부를 처음 탐구하기 시작했을 때 혼란스러웠던 것을 기억합니다. 이것은 매우 간단한 설명입니다. 최신 시스템을 이해하려면 이와 같은 StackExchange 답변에 맞추기에는 너무 광범위한 배경 지식이 필요합니다.
로그인 자격 증명은 이라는 권한 있는 프로세스에 의해 요청 login
됩니다 ls -l /bin/login
. (물론 소스도 사용 가능합니다.) 자세한 내용은 에서 확인하세요 man login
.
무엇보다도 이 프로세스는 여러 라이브러리 호출(PAM 라이브러리를 통해, 참고자료 참조 man 7 pam
)을 사용하여 자격 증명을 확인하고 시간 제한이 없는지, 홈 디렉터리가 존재하는지 등을 확인합니다. 모든 조건이 충족되면 권한을 포기하고 원하는 셸의 복사본을 시작합니다. 일반적으로(그러나 배타적이지는 않음) 이는 의 마지막 필드로 정의됩니다 /etc/passwd
.
다음 명령을 사용하면 자신의 비밀번호 항목을 볼 수 있습니다(이상하게도 비밀번호의 암호화된 사본도 포함하지 않은 경우도 있음) getent
.
getent passwd "$USER"
roaima:x:1001:1001:Roaima:/home/roaima:/bin/bash
이 파일 구조에 대한 자세한 내용은 에서 확인할 수 있습니다 man 5 passwd
.
쉘에 대한 엄격하고 빠른 요구 사항은 없습니다 /bin/bash
. 자신의 계정 권한으로만 실행되므로 완전히 사용자 정의할 수 있습니다.
이는 쉘 자체가 사용자의 자격 증명에 대해 아무것도 모른다는 점을 설명하기를 바랍니다. 대화형 모드에서 실행될 때 읽는 일반적인 프로그램(아마도 복잡한 프로그램)일 뿐입니다.표준 입력그리고 에 편지를 쓰세요표준 출력. 비대화형 모드에서 동일한 프로그램을 사용하여 파일, 파이프 또는 소켓을 읽고 쓸 수 있습니다.
원칙적으로 입력에서 한 줄을 읽고 단어를 공백으로 나눈 다음 하위 프로세스를 분기하여 execvpe()
프로그램을 호출하고 실행하는 자체 셸을 작성할 수 있습니다. (실제로는 인용된 문자열을 분할하지 않는 것, 상위( )에서 직접 연산하는 것, 시그널 등 극복해야 할 추가적인 장애물이 많습니다 chdir
.)cd