sudo -u는 $HOME/.profile에 경로를 추가하지 않습니다.

sudo -u는 $HOME/.profile에 경로를 추가하지 않습니다.

루트 권한이 필요한 스크립트가 있습니다. 나는 실행 스크립트를 사용합니다 sudo ./script.sh. 스크립트의 일부 부분은 실제로 원래 사용자로 실행되어야 하므로 sudo --user=$SUDO_USER스크립트 내에서 이를 사용하여 작업을 수행합니다. 내가 겪고 있는 문제는 사용자를 위해 일부 유틸리티가 설치되어 있고 해당 경로가 내 에 추가된다는 것입니다 ~/.profile. sudo로 실행할 때 ~/.profile이 실행되지 않는 것 같습니다. 확인되었습니다 sudo --user=$SUDO_USER echo $PATH.

$HOME/.profile을 가져와서 이 문제를 해결할 수 있지만 이는 올바른 해결책이 아닌 것 같습니다.

sudo --user=$SUDO_USER source $HOME/.profile; command_i_want_to_run

상황에 관계없이 사용할 수 있도록 다른 파일에 $PATH를 추가해야 합니까?

답변1

로컬 sudoers 정책에 따라 달라지는지는 잘 모르겠지만 적어도 내 Ubuntu 시스템에서는 sudo -i또는 옵션을 사용하여 --login로그인 셸을 지정할 수 있습니다.

 -i, --login
             Run the shell specified by the target user's password data‐
             base entry as a login shell.  This means that login-specific
             resource files such as .profile or .login will be read by the
             shell.

예를 들어

$ sudo sudo -u steeldriver sh -c 'echo $PATH'
[sudo] password for steeldriver: 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

하지만

$ sudo sudo -iu steeldriver sh -c 'echo $PATH'
/home/steeldriver/bin:/home/steeldriver/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

답변2

bashrc비슷한 구성 파일을 얻지 못하는 이유는 sudo가 셸을 실행하지 않기 때문입니다. 실제로 프로세스를 분기하고 다른 작업을 수행하므로 반드시 쉘과 관련된 것은 아닙니다. 이 글을 더 자세히 읽고 싶으시면 Process model에서 검색해 보세요 man sudo.

나는 당신이 선택할 수 있는 두 가지 합리적인 옵션을 생각할 수 있습니다.

  1. sudo에게 로그인 쉘을 사용하도록 지시할 수 있습니다.
  2. sudo를 사용하여 bash를 실행하고 bash를 로그인 쉘로 지정할 수 있습니다.

둘 다 약간 다른 방식으로 동일한 목표를 달성합니다.

옵션 1: sudo --user=baam -i echo '$PATH'sudo에게 기본 쉘을 시작 baam하고 실행하라고 지시합니다 echo $PATH. 원래 명령의 따옴표를 참고하세요. $PATH그렇지 않으면 확장됩니다.앞으로배쉬가 그걸 봤어.

옵션 2: sudo --user=baam bash -c -l 'echo $PATH'bash는 sudo를 사용하여 실행됩니다. 이 -l플래그는 bash에게 로그인 셸 역할을 하도록 지시하므로 이 플래그를 지원하는 다른 셸(예: )을 지정할 수도 있으므로 전체적으로 더 유연하기 때문에 .profile이것이 더 나은 솔루션이라고 생각합니다 .-lzsh

관련 정보