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 인지 테스트합니다 .bash
bash
HOME
bash
/etc
$uid