Пример команды следующий, запускается как обычный пользователь

which python
/home/me/env/development/python 

потому что среда PATH содержит путь, указывающий на этот экземпляр python (вместо этого он указывает на /usr/bin/python).

Я хочу иметь возможность запустить команду Python с той же переменной среды, поэтому

sudo which python

который возвращает /usr/bin/python . Использование опции -E дает тот же результат.

Как запустить команду python с правами root, но с сохранением переменных среды. Я не хочу указывать их все с помощью команды sudo, и я предполагаю, что «скопировать» только переменные PATH должно быть достаточно.

Вопрос сформулирован другими словами: как я могу запустить команду python с sudo , которая имеет то же определение PATH что и я в настоящее время, как обычный пользователь?

1 ответ1

0

Если вы используете "!Параметр env_reset » для его отмены и« secure_path »не задан в файле вашего sudoer, тогда параметры" env_check "и« env_delete »могут убрать PATH из освобождения от сброса (т.е. они функционируют как записи черного списка).

Более вероятной причиной может быть то, что система /etc /bashrc или ваш собственный .bashrc сбрасывает PATH к некоторому стандартному значению (и не добавляет его к существующему пути, если это необходимо).

В моем собственном "системном" bashrc (который я храню в /etc /local и вызывается после системного bashrc) я стараюсь не перезаписывать переданный путь некоторыми функциями, определенными при входе в систему:

# used in _path_op below
function empty {
    [[ $# -lt 1 ]] && return -1
    [[ -f $1 && ! -s $1 ]] && return 0
    [[ -d $1 ]] && {
        local -a entries=("$1"/*)
        [[ ${entries[0]} == "$1/*" ]] && return 0
    }
    return 1
}

function _path_has_subpath { [[ ${!1} =~ (:$2:|^$2:|:$2$) ]] ; }

function _path_op {
    (($#<3)) && return 1        # 3rd arg is path to <X>pend
    local fmt="$1" pathname="$2"; shift 2
    while (($#)); do 
        [[ -d $1 ]] && ! empty "$1" && {
            _path_has_subpath "$pathname" "$1" || 
                eval "export $(set $pathname $1; eval "echo $fmt")"
        }
        shift; 
    done    
}

# called with name of path (ex. 'PATH' & one or more sub paths 
# each of these prepend an "assign FORMAT" to the passed-in PATHVAR + pathcomp
function _path_append  { _path_op '$1=\"${!1}:$2\"' "$@" ; }
function _path_prepend  { _path_op '$1=\"$2:${!1}\"' "$@" ; }
typeset -x  _path_append _path_prepend _path_has_subpath _path_op

Я звоню им через:

_path_append PATH /opt/kde3/bin /usr/local/bin "$PATH_HOME/bin" 
_path_prepend PATH "$PATH_HOME/bin/lib"

Конечно, если проблема в bashrc вашего дистрибутива, вы можете сообщить об ошибке ... ;-)

(это предполагает, что вы не вызываете sudo с "-i", который говорит, что нужно начинать с новой среды).

FWIW, в начале и в конце моего различного профиля и файлов bashrc и env и их подфайлов ... И в версиях моего дистрибутива (должны быть прочитаны после обновления). Я помещаю отладочные строфы, которые обычно неактивны. В начале:

[[ ${DEBUG:-} || -O /tmp/debug_local ]] && { 
  echo "(${#BASH_LINENO[@]:-""})entering $BASH_SOURCE ..." >&2;
  [[ -O /tmp/debug_local ]] && source /tmp/debug_local ; }

и конец:

[[ ${DEBUG:-} || -O /tmp/debug_local ]] && { 
  echo "(${#BASH_LINENO[@]:-""})exiting $BASH_SOURCE ..." >&2;

Затем, если мне понадобится отладить проблему, подобную этой, я могу коснуться /tmp /debug_local, и она создаст шумные входы в систему для всех пользователей в моей системе (которая обычно есть только у меня в системе, на которой у меня это включено).

Также полезно, если вы активируете «-x», это меняет вашу линию PS4:

#export PS4='>>\
[$(__age)]${BASH_SOURCE:+${BASH_SOURCE[0]}}#i\
${LINENO}${FUNCNAME:+(${FUNCNAME[0]})}> '    

(Все вышеперечисленное - одна строка, разделенная обратной косой чертой - это тоже комментарий, то есть некомментированный для использования)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .