"man"은 루트와 사용자에 대해 다르게 동작합니다.

"man"은 루트와 사용자에 대해 다르게 동작합니다.

최근 한 사용자가 나에게 도움을 요청하여 다음과 같이 썼습니다.

"통화에 man /bin/find잘못된 문자가 표시되는 이유는 무엇입니까?"

man나는 그가 경로를 제공함으로써 이를 잘못 사용하고 있다고 대답했습니다. 즉, man실행 파일을 매뉴얼 페이지 소스 파일로 해석하고 경로 없이 테마 이름만 제공해야 한다고 대답했습니다. 즉, man find그때 그가 저를 당황하게 만드는 질문을 생각해 냈습니다.

"그럼 루트로 실행하면 왜 작동하나요 sudo man /bin/find?"

나는 그것을 시도했고, 루트 쉘을 사용하거나 sudo루트 쉘에서 루트로 호출할 때 sudo man /bin/find실행 파일 대신 매뉴얼 페이지가 표시됩니다.

  • 특별한 것은 없습니다 find. 이것은 모든 실행 파일에 적용됩니다.
  • 이는 RHEL 7 및 8에서 발생하지만 Mac OS에서는 바이너리를 루트 또는 사용자로 표시합니다.
  • 의 매뉴얼 페이지에서 이에 대한 언급을 찾을 수 없습니다 man.
  • 나는 현실 점검을 수행했고 ls -i man동일한 sudo ls -i man인덱스 노드를 반환했습니다. 에 대해서도 마찬가지입니다 /bin/find.
  • man아직 별칭이 지정되지 않았습니다.
  • 셸에서 실행하면 bash -x대체 항목이 표시되지 않습니다.

나는 확실히 간단한 것을 간과하고 있습니다. 이 현상에 대한 설명은 무엇입니까?

답변1

나는 그것을 테스트했고 당신 말이 맞습니다. man /usr/bin/find바이너리가 아닌 디스플레이 페이지를 감독합니다 . 뿐만 아니라 추가하면 /bin바이너리 $PATH대신 페이지도 표시됩니다 man /bin/find. 실제 루트(sudo가 아님)가 바이너리를 표시하는지 확인할 수도 있습니다.

그럼 여기서 무슨 일이 벌어지고 있는 걸까요?

  1. Man이 경로가 존재하는 경우 매개변수에서 해당 경로를 제거하십시오 $PATH. 실행 가능한 경로를 제거해도 바이너리가 표시되지 않는 것은 분명한 것 같습니다 man. 아마도 그들은 인수의 용어와 이진법을 구별하는 다른 방법이 없을 수도 있습니다.
  2. 승인되지 않은 명령이 실행되는 것을 방지하기 위해 sudo는 EL 시스템에 자체 정의를 갖고 있으며 PATH모든 명령은 다른 환경에서 실행됩니다.secure_path/etc/sudoers/sbin:/bin:/usr/sbin:/usr/binsudoPATH
  3. EL 시스템에서 /bin/find이것은 하드 링크 이며 /usr/bin/find기본적으로 /bin추가되지 않습니다 $PATH. 이로 인해 man이것이 바이너리라는 것을 이해하지 못했지만 sudo추가되었으므로 /bin이제 $PATH이해할 man수 있게 되었습니다.

관련 정보