나는 다음 사항에 대해 혼란스러워합니다.
[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)을 보여 주며 $PATH
sudo인 경우에도 경로에 있어야 하지만 실행하려고 하면 which
경로가 어떻게든 변경되었음을 보여줍니다.
sudo -E
이 동작은 변경되지 않습니다.
무엇을 제공합니까? $PATH가 보존되나요? 다른 곳에서 경로를 찾고 있습니다 which
(이 바이너리를 sudo로 실행할 수 없다는 점에 유의하세요).
답변1
여기에는 두 가지 질문이 있습니다.
이
$PATH
변수는 명령이 실행되기 전에 확장됩니다. 최종 결과는 다음과 같습니다. 작동하기는 하지만 실제로 원하는 것은 아닙니다.sudo echo /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
$PATH
일반적 으로 보안상의 이유로 재설정됩니다.sudo
이를 사용하여 애플리케이션이 실행 중인 컨텍스트에서 sudo env | grep ^PATH=
값을 찾을 수 있습니다. 이 파일을 편집하는 데 사용되는 경로를 조정하여 구문 검사의 이점을 얻을 수 있습니다.$PATH
sudo
/etc/sudoers
sudo visudo
앞으로파일을 변경했습니다.
답변2
읽다 man sudo sudoers
. 이 명령은 쉬운 보안 허점을 피하기 위해 sudo
의도적으로 사용자의 명령을 무시합니다 .$PATH