Почему 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.