왜 sudo는 일반 사용자가 할 수 있는 명령을 찾을 수 없나요?

왜 sudo는 일반 사용자가 할 수 있는 명령을 찾을 수 없나요?

얼마 전 NPM을 설치하고 sudo를 사용하여 설치 셸 스크립트를 실행하려고 할 때 일부 명령을 찾을 수 없다는 오류가 발생하는 것을 발견했습니다. 그러나 sudo 없이 동일한 스크립트를 실행하려고 하면 모든 것이 매력적으로 작동했습니다.

저는 새로운 Linux 사용자이지만 제가 이해한 바에 따르면 sudo의 권한과 가시성은 일반 사용자의 상위 집합입니다.

왜 이런 일이 발생합니까?

답변1

내가 이해한 바에 따르면 sudo의 권한과 가시성은 일반 사용자의 상위 집합입니다.

권한은 있습니다. 하지만 가시성이 반드시 필요한 것은 아닙니다. 애플리케이션의 가시성은 PATH환경 변수 에 따라 결정됩니다.

~$ printenv PATH
/home/vanadium/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/games

명령이 입력되면 명령 해석기는 먼저 해당 명령이 내부 명령인지, 디스크의 실행 파일 이름과 일치하는지 확인합니다. 그런 다음 시스템은 PATH명령과 일치하는 이름을 가진 실행 파일을 찾을 때까지 나열된 디렉터리를 검색합니다 .

예제에서 볼 수 있듯이 사용자는 PATH명령을 실행할 때만 검색되는 추가 개인 디렉터리를 가질 수 있습니다. 따라서 사용자 계정은 root사용자, 즉 명령을 사용할 때 가정되는 역할인 관리자 와는 다른 명령을 사용할 수 있습니다 sudo.

그러나 실행 파일의 권한은 궁극적으로 파일을 실행할 수 있는 사람을 결정합니다. 권한이 허용하는 경우 프롬프트에 전체 경로 이름(예: /usr/bin/mount파일 이름만 제공하는 대신) 을 제공하여 실행 파일을 항상 실행할 수 있습니다 mount. 그리고 실제로 root실행 가능 비트가 설정되어 있는 한 항상 실행될 수 있습니다. 소유자에게만 해당되는 경우에도 마찬가지입니다.

답변2

디렉터리 스크립트에서 파일을 실행하고 싶다고 가정해 보겠습니다. 당신은 다음을 실행합니다 :

myscript.sh

스크립트가 정상적으로 실행됩니다. 그러나 sudo를 실행하면 다음과 같은 오류가 발생합니다.

sudo: myscript.sh: file not found

sudo를 사용할 때마다 루트 사용자의 경로를 사용합니다. 이에 대한 해결책은 다음과 같이 명령을 실행하는 것입니다.

sudo ./myscript.sh

답변3

쉘(bash 등)은 일반 사용자 모드와 sudo 모드에서 서로 다른 변수를 사용합니다. 다음 절차에 따라 간단히 확인하세요.

# Plain user
printenv > env1
# Using sudo
sudo printenv > env2
# Comparison
diff env1 env2
# Alternative comparison using the GUI tool meld
meld env1 env2

Meld가 설치되어 있지 않은 경우에는 쉽게 설치할 수 있습니다. 매우 유용합니다.

sudo apt-get update
sudo apt-get install meld

일반 사용자/sudo 변수의 다양한 내용은 쉘 동작과 스크립트 기능에 영향을 미칠 수 있습니다.

파일 액세스 권한도 다릅니다.

답변4

실제로는 그보다 조금 더 복잡합니다. 에는 몇 가지 정의가 있어야 합니다 /etc/sudoers.

환경에 어떤 일이 발생하는지 결정하는 제어 플래그는 , 및 sudo입니다 .env_checkenv_keepenv_reset

그만큼sudoers를 위한 매뉴얼 페이지"명령 환경" 섹션에서 이에 대해 잘 설명하고 있습니다.

$ man --pager="less -p '^\ *Command environment'" sudoers

기본 Ubuntu 구성에서는 정의된 플래그가 PATH호출됩니다 secure_path(기본적으로 활성화됨). 이 값은 기본적으로 활성화되어 있으므로 시작할 PATH사용자 대신 사용됩니다 .sudoenv_reset

$ man sudoers | egrep "^\ *secure_path" -A4 | sed 's/^ *//'

secure_path   If set, sudo will use this value in place of the user's PATH environment variable. This option can be used to reset the PATH to a known good
value that contains directories for system administrator commands such as /usr/sbin.

Users in the group specified by the exempt_group option are not affected by secure_path.  This option is not set by default.

(편집: 위의 마지막 줄은 exempt_group이 아니라 이 기본적으로 활성화되어 있지 않음 을 나타냅니다 secure_path.)

(권장) 을 사용하여 수정 visudo하거나 표시할 수 있습니다.

$ sudo grep secure_path /etc/sudoers
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

다른 경우에는 명령이 bash(예 echo: )에 내장되어 있고 변수에서 참조할 수 있는 실행 파일이 아닙니다 PATH. 이때는 어떤 값을 sudo bash -c또는다른 방법들.

관련 정보