sudo -E는 홈 디렉토리에 있는 특정 명령을 실행할 수 없습니까?

sudo -E는 홈 디렉토리에 있는 특정 명령을 실행할 수 없습니까?

징후:

$ sudo -E adb
sudo: adb: command not found

$ which adb
/home/usr/opt/android/platform-tools/adb

$ sudo -E echo ${PATH}
...:/home/usr/opt/android/platform-tools

$ stat ~/opt/android/platform-tools/adb
Access: (0775/-rwxrwxr-x)  Uid: ( 1000/ usr)   Gid: ( 1000/ usr)

@리차드님, 감사합니다. 나는 이걸했다:

$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ echo 'echo $PATH' | sudo -E sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

따라서 sudo의 경로에 있지 않습니다. 하지만 sudo가 일시적으로 PATH를 존중하도록 하려면 어떻게 해야 합니까?

답변1

전혀 그렇지 않다! ( 환경의 PATH에는 /home/usr/opt/android/platform-tools없습니다 .) 실행하기 전에 쉘에서 평가하므로 in의 값이 아닌 isstart 이전의 값을 바꾸십시오.sudo${PATH}sudoPATHsudosudo

당신의 의심은 정확합니다 PATH. 그러나 평가 순서로 인해 테스트에서 잘못된 답변이 제공됩니다.

당신은 할 필요가sudo -E /home/usr/opt/android/platform-tools/adb

답변2

아시다시피, sudo재설정을 사용하면 $PATH실행할 유틸리티의 전체 경로를 지정할 수 있으며 대부분의 간단한 경우에는 제대로 작동합니다. 그러나 어떤 경우에는 예약해야 할 수도 있습니다 . 예를 들어 프로그램이 $PATH제공된 프로그램 중에서 찾을 수 없는 다른 $PATH프로그램을 호출해야 하는 경우입니다 sudo.

가장 간단한 방법은 다음과 같습니다.

sudo env PATH="$PATH" mycmd

이는 쉘의 평가 순서를 활용합니다. 실행하기 전에 확장 $PATH하면 실제로는 다음과 같습니다.sudo

sudo env PATH="/usr/local/sbin:/usr/local/bin:..." mycmd

sudo그런 다음 을 호출하면 지시대로 설정되고 을 호출 env합니다 .$PATHmycmd

이는 sudo액세스가 제한되지 않고 모든 명령(또는 모든 명령)을 실행할 수 있는 경우에만 작동합니다 env.

관련 정보