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_reset
を追加してみましたが、それでも同じエラーで失敗します。明らかなものが欠けている可能性があり、2つ目の目が必要なようです。ここで何が欠けていますか?
次のように、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タグを使用してオーバーライドできます。
-E
オプションは指定しないでください。 -E
を使用すると、GIT_DIR
だけでなく、ユーザーdeploy
のすべての環境変数を保持する必要があることになります。
Sudo echo $GIT_DIR
をGIT_DIR
リストに追加したため、env_keep
の実行は正常に機能するはずです