sudo 에코 경로는 sudo로 실행하는 데 사용되는 경로를 표시하지 않습니다.

sudo 에코 경로는 sudo로 실행하는 데 사용되는 경로를 표시하지 않습니다.

나는 다음 사항에 대해 혼란스러워합니다.

[user@QVr740-11 ~]$ which ninja
/usr/local/bin/ninja
[user@QVr740-11 ~]$ sudo which ninja
which: no ninja in (/sbin:/bin:/usr/sbin:/usr/bin)
[user@QVr740-11 ~]$ sudo echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin

ls -l /usr/local/bin/ninja이는 바이너리가 root:root에 의해 소유되고 모든 사람이 실행할 수 있음(3개의 x)을 보여 주며 $PATHsudo인 경우에도 경로에 있어야 하지만 실행하려고 하면 which경로가 어떻게든 변경되었음을 보여줍니다.

sudo -E이 동작은 변경되지 않습니다.

무엇을 제공합니까? $PATH가 보존되나요? 다른 곳에서 경로를 찾고 있습니다 which(이 바이너리를 sudo로 실행할 수 없다는 점에 유의하세요).

답변1

여기에는 두 가지 질문이 있습니다.

  1. $PATH변수는 명령이 실행되기 전에 확장됩니다. 최종 결과는 다음과 같습니다. 작동하기는 하지만 실제로 원하는 것은 아닙니다.

    sudo echo /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
    
  2. $PATH일반적 으로 보안상의 이유로 재설정됩니다.sudo

이를 사용하여 애플리케이션이 실행 중인 컨텍스트에서 sudo env | grep ^PATH=값을 찾을 수 있습니다. 이 파일을 편집하는 데 사용되는 경로를 조정하여 구문 검사의 이점을 얻을 수 있습니다.$PATHsudo/etc/sudoerssudo visudo앞으로파일을 변경했습니다.

답변2

읽다 man sudo sudoers. 이 명령은 쉬운 보안 허점을 피하기 위해 sudo의도적으로 사용자의 명령을 무시합니다 .$PATH

관련 정보