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 명령은 루트 사용자와 동일한 환경을 가지고 있지 않습니까?
답변1
.bashrc
이는 bash의 구성 파일이며 대화형으로 실행될 때만 유효합니다. 이는 bash를 시작할 때만 로드되며 다른 프로그램을 실행할 때는 로드되지 않습니다 sh
(예: 이름으로 bash 호출 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'
답변2
보기 -E
및 -i
옵션. 해당 발췌문은 다음과 같습니다 man sudo
.
-E
: 사용자가 기존 환경 변수를 유지하려는 보안 정책을 나타냅니다. 사용자에게 환경을 보호할 권한이 없으면 보안 정책에서 오류가 반환될 수 있습니다.
-i
: 대상 사용자의 비밀번호 데이터베이스 항목에 지정된 쉘을 로그인 쉘로 실행합니다. 이는 쉘이 로그인별 리소스 파일(예: 또는 )을 읽는다는 의미입니다.profile
..login
명령이 지정되면-c
쉘의 옵션을 통해 실행할 수 있도록 쉘에 전달됩니다. 명령이 지정되지 않으면 대화형 쉘이 실행됩니다.sudo
쉘을 실행하기 전에 해당 사용자의 홈 디렉토리로 변경해 보십시오. 이 명령은 사용자가 로그인할 때 받는 것과 유사한 환경에서 실행됩니다.명령 환경sudoers(5)
-i
정책을 사용할 때 이 옵션이 명령이 실행되는 환경에 어떤 영향을 미치는지 설명하는 섹션이 설명서에 있습니다 .sudoers
답변3
맨 페이지/문서에 설명된 시작 파일을 sudo bash
읽을 수 있습니다. 하지만 환경 변수가 올바르게 설정 되지 않을 수도 있다는 점에 유의하세요 . 이 문제는 시스템 전체 시작 파일에서 수정할 수 있습니다( 에서 정확한 위치는 배포판에 따라 다름). 0 에 대해 테스트하세요.bash
bash
HOME
bash
/etc
$uid