이것은 실제로 질문이 아니며 단지 알고 싶은 기능입니다.
루트 쉘을 얻고 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
또는에 지정된 명령을 호출하는 방법 때문에 발생합니다. 환경 변수가 설정되면 해당 값을 셸로 사용하여 실행합니다.LESSOPEN
LESSCLOSE
SHELL
따라서 시나리오에서 LESSOPEN
설정된 대로(사용된 이후 lesspipe
) 및 less
해당 실행은 "$SHELL" -c …
해당 결과가 파일 콘텐츠로 표시됩니다(이것이 파이프라인의 예상되는 동작이므로 LESSOPEN
). SHELL
is 때문에 nologin
이 명령의 출력이 표시됩니다.
기본 설정에서는 lesspipe
파이프 자체가 파이프로부터 입력을 받는 경우 파이프가 사용되지 않습니다. 이것이 바로 이 동작을 설명하는 것입니다.less
SHELL
로그인 쉘로만 설정됩니다. bash
없이 실행 하면 이전에 가졌던 모든 값이 유지됩니다 -l
.SHELL
(실제로 less
사용하기 때문에 popen
run 명령어는 sh -c "$SHELL" -c …
)