sudo 및 su를 통해 실행할 때 PATH 변수가 다른 이유는 무엇입니까? /usr/local/bin내 경로에 있습니다. [justin@justin-fedora12 ~]$ env |

내 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입니까?



답변

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

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

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


답변

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

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

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


답변

을 실행하여 이유 가 다른지 확인할 수 있습니다 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"


답변

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

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


답변

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


답변

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

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


답변

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

어떤 /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에서 이것이 사실임을 알았습니다. 다른 버전이나 배포판을 확인하지 않았습니다.