Почему sudo -E на самом деле не защищает мою окружающую среду?

Я пытаюсь sudo некоторые двоичные файлы, которые лежат в произвольном пути. Этот пользовательский путь удаляется при запуске sudo хотя, но sudo -E должен сохранить мой путь. Почему это не работает?

$ env | egrep ^ PATH
PATH = / дом /codemonkey/.nvm/v0.6.1/ бен: / USR / местные / бен: / USR / бен: / бен: / USR / местные / гам
ES: / USR / игры

$ sudo env | egrep ^PATH
PATH=/ USR / местные / SBIN: / USR / местные / бен: / USR / SBIN: / USR / бен: / SBIN: / бен: / USR /X11R6/ бен

$ sudo -E env | egrep ^PATH
PATH=/ USR / местные / SBIN: / USR / местные / бен: / USR / SBIN: / USR / бен: / SBIN: / бен: / USR /X11R6/ бен

Я знаю, как обойти это, я просто хочу знать, почему sudo -E не работает

4 ответа

Решение

Вы можете установить exempt_group возможность сказать судо, чтобы сохранить PATH для пользователей в этой группе.

Например, скажем, ваш пользователь находится в группе 'sys'. Добавьте следующее в ваш файл sudoers

Defaults exempt_group="sys"

Теперь ваш пользователь не будет иметь PATH сброс для команд sudo (-E не нужно для этого работать).
Смотрите man-страницу для более подробной информации.

РЕДАКТИРОВАТЬ: собирается отметить это как плохой ответ. Это правда, что это работает, но у него есть побочный эффект, который я не заметил, играя с ним. Это также освобождает пользователей в этой группе от необходимости вводить свой пароль. Кажется, вы не можете получить сохранение PATH, не допустив этого. Немного глупо, я думаю...

От sudoers(5):

 setenv            Allow the user to disable the env_reset option from the 
                   command line via the -E option.  Additionally, environment
                   variables set via the command line are not subject to the
                   restrictions imposed by env_check, env_delete, or env_keep.  
                   As such, only trusted users should be allowed to set  
                   variables in this manner.  This flag is off by default.

Предлагаю другое решение в дополнение к тому, которое я уже ввел. Это работает только для bash (но может быть изменено для других оболочек).

Ниже обертка sudo это будет искать команду, которую вы передаете ему. Как только он находит команду, он меняет ее на полный путь.
Так в действительности sudo echo hello становится sudo /bin/echo hello,

Поместите следующее в ваш ~/.bashrc

function sudo() {
   local ARGS
   declare -a ARGS=()
   while (( $# )); do
      if [[ "${1:0:1}" == "-" ]]; then
         # the argument is a dash-arg; '-s' for example
         ARGS[${#ARGS[@]}]="$1"
         if [[ "$1" =~ ^-[pugD]$ ]]; then
            # these are the arguments that take a parameter, so skip the next
            ARGS[${#ARGS[@]}]="$2"
            shift
         fi
         shift
      elif [[ "$1" == *"="* ]]; then
         # the argument is a env var to set, not a command
         ARGS[${#ARGS[@]}]="$1"
         shift
      else
         # finally, a command
         CMD="$(which --skip-alias --skip-functions "$1")"
         [[ -z "$CMD" ]] && ARGS[${#ARGS[@]}]="$1" || ARGS[${#ARGS[@]}]="$CMD"
         shift
         break
      fi
   done
   command sudo "${ARGS[@]}" "$@"
}

Обратите внимание, что он не будет правильно обрабатывать его, если у вас есть команда с = в его названии. Это крайне маловероятно, поэтому я принял это предостережение, чтобы сделать его простым.

Я бы посмотрел на опции в файле sudoers, так как они управляют некоторым поведением sudo.

И, конечно же, я обращался к странице справочника за файлом sudoers.

Другие вопросы по тегам