sudo 및 su를 통해 실행할 때 PATH 변수가 다른 이유는 무엇입니까?


39

내 fedora VM에서 사용자 계정으로 실행할 때 /usr/local/bin내 경로에 있습니다.

[justin@justin-fedora12 ~]$ env | grep PATH
 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

그리고 달리는 경우에도 su:

[justin@justin-fedora12 ~]$ su -
Password: 
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

그러나를 통해 실행할 sudo때이 디렉토리는 경로에 없습니다.

[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin

를 통해 실행할 때 경로가 다른 이유는 무엇 sudo입니까?



답변:


37

살펴보십시오 /etc/sudoers. Fedora의 기본 파일 (RHEL 및 Ubuntu 및 이와 유사한 파일)에는 다음 줄이 포함됩니다.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

sudo에서 바이너리를 실행할 때 경로가 깨끗하게 유지됩니다. 이것은 이 질문에 언급 된 일부 우려 사항을 방지하는 데 도움이됩니다 . 당신이없는 경우에도 편리 /sbin하고 /usr/sbin자신의 경로에.


아, 내 파일에서 볼 수 있습니다. 그래서, 난 싶지,하지만 내가 추가 한 경우 /usr/local/bin이 지침에 그때 를 통해 실행할 때 내 길에서 볼 sudo오른쪽?
Justin Ethier

난 그냥 그것을 시도하고 지금 참조하십시오 /usr/local/bin. 이것을 설명해 주셔서 감사합니다!
Justin Ethier

스크립트와 바이너리에 대한 사용자 경로를 추가 sudo하는 ~/bin것은 어떻습니까? 예를 들어 스크립트를 (또는 사용하는 경로) 스크립트를 작성 해야 할 때 절대 경로를 작성할 필요가 없습니까? 방금 변경했습니다. 효과가 있지만 반대쪽이있을 것이라고 생각 했습니까?
Emanuel Berg

@mattdm 예, Ubuntu도 VM을 사용할 때 Ubuntu Vivid에서 해당 문제가 발생했습니다. 데비안도 마찬가지입니다 .
kenorb

9

이 명령 su -은 루트 사용자 프로필을 실행하고 경로 등을 포함하여 해당 사용자 환경을 sudo수행하지 않습니다.

다음 과 같이 sudo동작 하려면 사용자 프로필을 실행하는 su -옵션을 사용하십시오.sudo -i [command

다음 과 같이 su -동작 sudo하려면 하이픈을 사용하지 마십시오.su [command]


2

을 실행하여 이유 가 다른지 확인할 수 있습니다 sudo sudo -V.

예를 들어 Linux에서 다음을 실행하십시오.

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

참고 : macOS / BSD에서는 다음을 실행하십시오 sudo sudo -V.

위의 목록은 일부 Linux 배포판의 기본 보안 정책 플러그인으로 인해 제한됩니다.


이에 대한 자세한 설명은 다음과 man sudoers같습니다.

경우 secure_path옵션을 설정, 그 값은에 사용되는 PATH환경 변수입니다.

secure_path-sudo에서 실행되는 모든 명령에 사용되는 경로. 제정신 PATH환경 변수 를 가지고 sudo를 실행하는 사람들을 신뢰하지 않는다면 이것을 사용하고 싶을 것입니다.

또 다른 용도는“루트 경로”를“사용자 경로”와 분리하려는 경우입니다. exempt_group옵션으로 지정된 그룹의 사용자는의 영향을받지 않습니다 secure_path. 이 옵션은 기본적으로 설정되어 있지 않습니다.

이 경우 sudo visudo구성 파일 을 실행 및 편집하고으로 secure_path구분 된 추가 경로를 수정하거나 (으로 구분 된 추가 경로 :추가) 사용자를 추가하여 exempt_group( secure_path옵션의 영향을받지 않음 ) 변경하여 변경할 수 있습니다.

또는 사용자의 PATH임시 를 전달하기 위해 다음을 실행할 수 있습니다.

sudo env PATH="$PATH" my_command

다음을 통해 확인할 수 있습니다.

sudo env PATH="$PATH" env | grep ^PATH

참조 : 보존 하는 방법 ?sudo$PATH


환경이 다른 이유 sudo는 파일 env_reset에서 옵션을 활성화 할 수 있기 때문 sudoers입니다. 이로 인해 최소한의 새로운 환경에서 명령이 실행됩니다.

따라서 env_keep옵션 ( 보안상의 이유로 권장되지 않음 )을 사용하여 사용자의 환경 변수를 보존 할 수 있습니다.

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"

1

대부분의 Linux에서는 패키지 관리를 통해 프로그램을 설치하고 정기적으로 업데이트를받습니다. 패키지 관리를 우회하는 것을 설치하면 / usr / local / bin (예 : 또는 ... / sbin 또는 / opt)에 설치되고 정기적으로 업데이트되지 않습니다.

따라서 프로그램은 안전한 것으로 간주되지 않으며 기본적으로 루트 PATH에 넣지 않습니다.


+1-쿨, 나는 그것이 길에없는 이유를 궁금해하고 있었다. 가치있는 것을 위해, 나는 그것을 가지고 놀기 위해 node.js를 처음부터 구축하고 있었으므로 왜 거기에 넣었는지, 왜 sudo기본적 으로이 디렉토리를 제외시킬 것인지 이해 가됩니다.
저스틴에 티어

@Justin Ethier : 주제를 벗어 났지만 bugzilla.redhat.com/show_bug.cgi?id=634911
mattdm

1

방금 직접 시도했지만 보았던 동작을 보지 못했습니다. 경로가 동일하게 유지되므로 sudo 구성이 다를 수 있습니다. 확인 man sudoers하면 secure_path재설정 이라는 PATH옵션이 있습니다.이 옵션이 활성화 된 것 같습니다.


흥미 롭군 이것은 Fedora 12에있었습니다. 그만한 가치가 있습니다.
Justin Ethier

1

당신이 사용하는 경우 때문에 sudo bash, bash로그인 쉘의 역할을하지 않습니다. 로 다시 시도하면와 sudo bash -l같은 결과가 나타납니다 su -.

그게 맞다면, 다음의 차이 PATH구성 파일의 거짓말은 : /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile동안, 로그인 쉘 (순서대로) 실행되는 ~/.bashrc비 로그인 대화 형 쉘 실행됩니다.


0

오래된 질문은 알고 있지만,이 정확한 문제를 조사하고 있었기 때문에 지금 여기에서 우연히 발견되었습니다.

어떤 /usr/local/bin이유로을 통해 루트가 될 때 PATH에만있었습니다 sudo su -. sudo -i그것을 사용할 때 거기에 없었습니다. 물론 나는 그것을 / etc / sudoers에 추가 할 수 있다는 것을 알고 있지만 여전히 왜 이후에 있는지 설명하지 못했습니다 su -. PATH의이 부분은 어디에서 왔습니까?

많은 grepping과 search 후 답을 찾았습니다.

'/ usr / local / bin'을 포함하는 기본 경로는 실제로 su (1)에 하드 코딩됩니다.

따라서 pam 구성, 프로필, bashrc 또는이 요소를 선택적으로 추가하는 것은 없습니다. su인수 할 때는 항상 이미있었습니다 . 그리고 sudo전혀 호출하지 않고 su자체 구성을 사용하므로 이후에 누락되었습니다.sudo -i

RHEL6 및 RHEL7에서 이것이 사실임을 알았습니다. 다른 버전이나 배포판을 확인하지 않았습니다.


내가 어떻게 이것을 확인했는지 묻지 마라. 좋아, 주장한다면 : 나는 su바이너리 의 사본을 16 진수로 편집하고 /usr/local/bin다른 것으로 변경 하고 사본을 호출했다. 내 경로에 수정 된 문자열이 포함되었습니다 ... 좋은 아이들과 게으른 시스템 관리자는 물론 소스를 다운로드하고 체크인하십시오. ;-)
Oscar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.