루트 로그인 셸에서 파일을 실행할 때 `less`에 "이 계정을 사용할 수 없습니다"가 표시되는 이유는 무엇입니까?

루트 로그인 셸에서 파일을 실행할 때 `less`에 "이 계정을 사용할 수 없습니다"가 표시되는 이유는 무엇입니까?

이것은 실제로 질문이 아니며 단지 알고 싶은 기능입니다.

루트 쉘을 얻고 sudo bash -l실행하면 less somefilename더 적은 정보를 얻고 다음을 표시합니다.

이 계정은 현재 사용할 수 없습니다.

(이것은 다음과 같이 표시되지 않습니다.실수, 파일의 내용인 것처럼 less 안에 표시됩니다. )

그러나 동일한 루트 셸을 사용 sudo bash -l하고 실행 하면 cat somefilename | less파일의 실제 내용이 표시됩니다.

또한 루트 셸을 가져와서 sudo bash건너뛰고 -l실행 less somefilename하면 파일 내용이 표시됩니다.

루트 로그인이 비활성화되었습니다. /etc/passwd라인이 root:x:0:0:root:/root:/sbin/nologin전혀 작동하지 않습니다 sudo su -.

그런데 이 항목이 파일 nologin실행에 영향을 미치는 이유 는 무엇입니까? 왜 파일에서 직접 실행될 때만 효과가 있고 표준 입력에서 실행될 때는 효과가 없습니까 less? less게다가 왜 bash -l이런 일이 쉘에서만 발생합니까?

(이것은 CentOS 7 시스템에 있습니다.)

답변1

이는 less또는에 지정된 명령을 호출하는 방법 때문에 발생합니다. 환경 변수가 설정되면 해당 값을 셸로 사용하여 실행합니다.LESSOPENLESSCLOSESHELL

따라서 시나리오에서 LESSOPEN설정된 대로(사용된 이후 lesspipe) 및 less해당 실행은 "$SHELL" -c …해당 결과가 파일 콘텐츠로 표시됩니다(이것이 파이프라인의 예상되는 동작이므로 LESSOPEN). SHELLis 때문에 nologin이 명령의 출력이 표시됩니다.

기본 설정에서는 lesspipe파이프 자체가 파이프로부터 입력을 받는 경우 파이프가 사용되지 않습니다. 이것이 바로 이 동작을 설명하는 것입니다.less

SHELL로그인 쉘로만 설정됩니다. bash없이 실행 하면 이전에 가졌던 모든 값이 유지됩니다 -l.SHELL

(실제로 less사용하기 때문에 popenrun 명령어는 sh -c "$SHELL" -c …)

관련 정보