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

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 명령은 루트 사용자와 동일한 환경을 가지고 있지 않습니까?

답변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.bashrcsudo -i 'echo $PATH'.profilesudo sh -c '. ~/.profile; echo $PATH'

답변2

보기 -E-i옵션. 해당 발췌문은 다음과 같습니다 man sudo.

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

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

답변3

맨 페이지/문서에 설명된 시작 파일을 sudo bash읽을 수 있습니다. 하지만 환경 변수가 올바르게 설정 되지 않을 수도 있다는 점에 유의하세요 . 이 문제는 시스템 전체 시작 파일에서 수정할 수 있습니다( 에서 정확한 위치는 배포판에 따라 다름). 0 에 대해 테스트하세요.bashbashHOMEbash/etc$uid

관련 정보