[unix] sudo 명령은 /root/.bashrc를 소스하지 않습니다

PATH/root/.bashrc 파일에 변수에 대한 사용자 정의 경로를 추가했습니다

내가 할 때 sudo su; echo $PATH‘/ path / to / custom / bins’항목이 표시됩니다.

그러나 나는 sudo sh -c 'echo $PATH'그것을 보여줍니다.
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

.bashrc 파일에 추가 된 폴더 경로는 보이지 않습니다.

sudo 명령이 루트 사용자와 동일한 환경을 가지고 있지 않습니까?



답변

.bashrc대화식으로 실행될 때만 bash의 구성 파일입니다. bash를 시작할 때만로드되며 sh(bash가 name을 통해 호출 된 경우에도) 다른 프로그램을 실행할 때가 아닙니다 sh. 그리고 bash가 대화 형 일 때만로드되며 스크립트를 사용하거나 명령을 실행할 때가 아닙니다 -c.

sudo sh -c 'echo $PATH'또는 sudo bash -c 'echo $PATH'대화식 쉘을 호출하지 않으므로 .bashrc관련되지 않습니다.

sudo su; echo $PATH루트 쉘의 대화식 인스턴스를 실행합니다. 그것이 bash라면 ~root/.bashrc로드됩니다. 이 스 니펫은 echo $PATH이 대화식 쉘이 종료되면 실행 되므로 대화식 쉘에서 발생하는 내용은 스 니펫이 마지막에 인쇄하는 내용에 영향을 미치지 않습니다. 그러나로 echo $PATH시작되는 대화식 쉘 프롬프트에 입력하면에 의해 sudo su설정된 값이 표시됩니다 ~root/.bashrc.

.bashrc로그인 쉘이 아닌 각 대화식 쉘에서 호출 되기 때문에 (bash의 설계 결함 인 대화식 로그인 쉘조차도) 환경 변수를 정의하는 것은 잘못된 곳입니다. .bashrc키 바인딩, 별명 및 완료 설정과 같은 대화식 bash 설정에 사용하십시오 . : 로그인 할 때로드되는 파일에 설정된 환경 변수 ~/.pam_environment~/.profile.

그래서 설정 PATH.profile대신 .bashrc하고, 하나는 로그인과 쉘을 실행 sudo -i 'echo $PATH'하거나, 명시 적으로 소스 .profile와를 sudo sh -c '. ~/.profile; echo $PATH'.


답변

상기 봐 -E-i옵션을 제공합니다.

-E: 사용자가 기존 환경 변수를 유지하려는 보안 정책을 나타냅니다. 사용자에게 환경을 보존 할 권한이 없으면 보안 정책에서 오류를 반환 할 수 있습니다.

-i: 대상 사용자의 비밀번호 데이터베이스 항목으로 지정된 쉘을 로그인 쉘로 실행하십시오. 이는 .profile 또는 .login과 같은 로그인 특정 자원 파일을 쉘에서 읽음을 의미합니다. 명령이 지정되면 쉘의 -c 옵션을 통해 실행되도록 쉘로 전달됩니다. 명령을 지정하지 않으면 대화식 쉘이 실행됩니다. sudo는 쉘을 실행하기 전에 해당 사용자의 홈 디렉토리로 변경하려고 시도합니다. 명령은 사용자가 로그인 할 때와 유사한 환경에서 실행됩니다. sudoers (5) 매뉴얼의 명령 환경 섹션에는 sudoers 정책이 다음과 같은 경우 -i 옵션이 명령이 실행되는 환경에 어떤 영향을 미치는지 문서화되어 있습니다. 사용.


답변

설명서 페이지 / 설명서에 설명 된대로 시작 파일을 sudo bash읽는 작업을 수행 할 수 있습니다. 그러나 환경 변수가 올바르게 설정되지 않았을 수 있습니다 . 이는 시스템 전체 시작 파일 에서 수정 될 수 있습니다 (에서 정확한 위치는 배포판에 따라 다름)- 가 0 인지 테스트합니다 .bashbashHOMEbash/etc$uid


답변