사용자가 sudo로 환경을 보존하는 방법은 무엇입니까?


17

실행할 때 일부 환경 변수가 새 환경으로 전달되도록 시도하는 동안 다음 오류가 발생합니다 sudo.

sudo: sorry, you are not allowed to preserve the environment

디버깅하는 데 도움이되는 몇 가지 정보 :

[deploy@worker1 ~]$ sudo -l
    Matching Defaults entries for deploy on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
    XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, env_keep+="GIT_WORK_TREE GIT_DIR", !requiretty

User deploy may run the following commands on this host:
    (ALL) NOPASSWD: /usr/bin/git, (ALL) /etc/init.d/httpd*, (ALL) /sbin/service, (ALL) /usr/bin/make, (ALL) /bin/echo

내 실행 예 :

[deploy@worker1 ~]$ export GIT_DIR="/home/ashinn/testing"
[deploy@worker1 ~]$ sudo -E sh -c 'echo "$GIT_DIR"'
sudo: sorry, you are not allowed to preserve the environment

이 특정 구성에 대한 내 sudoers.d 파일 :

Defaults:deploy         env_keep += "GIT_WORK_TREE GIT_DIR", !requiretty
deploy  ALL=(ALL)       NOPASSWD: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

또한 !env_resetDefaults에 추가하려고 시도했지만 여전히 동일한 오류로 실패합니다. 나는 분명한 것을 놓치고 두 번째 눈이 필요할 것 같은 느낌이 든다. 내가 여기서 무엇을 놓치고 있습니까?


1
나는 우리의 대략 93 %가 당신의 질문의 요점을 이해한다고 믿지만, 당신의 예제 명령은 그리 좋지 않습니다.  쉘 이 실패 하기 전에 쉘이 명령 행에서 변수를 확장하기 때문에 , 실패하지 않으면의 사전 값을 표시합니다 . 더 나은 테스트는 또는 또는입니다 . 실제로 권한이 실행되는 프로세스의 환경을보고 있습니다. sudo (option(s)) echo $GIT_DIRsudo$GIT_DIRsudosudo printenv GIT_DIRsudo env | grep GIT_DIRsudo sh -c 'echo "$GIT_DIR"'
G-Man, 'Reinstate

답변:


27

SETENV다음 sudoers과 같이 파일 에서 "태그"를 사용할 수 있습니다 .

deploy  ALL=(ALL)       SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

또는 NOPASSWD와 결합하려면 :

deploy  ALL=(ALL)       NOPASSWD:SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

sudoers 남자의 관련 발췌 :

SETENV 및 NOSETENV

이 태그는 명령별로 setenv 옵션의 값을 대체합니다. SETENV가 명령에 대해 설정된 경우 사용자는 명령 줄에서 -E 옵션을 통해 env_reset 옵션을 비활성화 할 수 있습니다. 또한 명령 줄에서 설정 한 환경 변수 env_check에는 env_delete, 또는로 인한 제한이 적용되지 않습니다 env_keep. 따라서 신뢰할 수있는 사용자 만 이러한 방식으로 변수를 설정할 수 있어야합니다. 일치하는 명령이 ALL이면 해당 명령에 SETENV 태그가 내포됩니다. 이 기본값은 NOSETENV 태그를 사용하여 무시할 수 있습니다.


1

-E옵션을 지정하지 마십시오 . 사용 -E멋져요는 사용자의 모든 환경 변수가 말하는 deploy뿐만 아니라 보존해야GIT_DIR

실행 sudo echo $GIT_DIR추가 한 때문에 작동합니다 GIT_DIR받는 사람 env_keep목록

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.