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

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

내 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?

답변1

보세요 /etc/sudoers. Fedora(및 RHEL, Ubuntu 등)의 기본 파일에는 다음 줄이 포함되어 있습니다.

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

이렇게 하면 sudo에서 바이너리를 실행할 때 경로가 깔끔하게 유지됩니다. 이는 일부 문제를 피하는 데 도움이 됩니다.이 질문에 언급된. 이는 하나도 없고 자신만의 방식으로 수행하는 경우 /sbin에도 /usr/sbin유용합니다.

답변2

이 명령은 su -루트 사용자 프로필을 실행하고 사용자의 환경(경로 등 포함)을 가정하지만 sudo작업을 수행하지는 않습니다.

이렇게 하려면 사용자 프로필을 실행하는 옵션을 sudo사용하세요.su -sudo -i [command

su -이렇게 하려면 하이픈 sudo을 사용하지 말고 하이픈을 사용하세요.su [command]

답변3

당신은 확인할 수 있습니다(이것은 다릅니다) 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에서 실행되는 각 명령에 사용되는 경로입니다. sudo를 실행하는 사람이 정상적인 환경 변수를 가지고 있다는 것을 신뢰하지 않는 경우 이 방법을 사용할 수 있습니다 PATH.

또 다른 용도는 "사용자 경로"에서 "루트 경로"를 분리하려는 경우입니다. 이 옵션으로 지정된 그룹의 사용자 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_resetsudoers

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

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"

답변4

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

따라서 이러한 프로그램은 안전하지 않은 것으로 간주되며 기본적으로 루트 경로에 배치되지 않습니다.

관련 정보