Cómo hacer un comando sudo que mantiene todas las variables de entorno.

0

Ejemplo de comando es el siguiente, ejecute como un usuario normal

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

porque el PATH entorno contiene un camino que apunta a esta instancia de python (en lugar de apuntar a /usr/bin/python ).

Quiero poder ejecutar un comando de python con la misma variable de entorno, por lo que

sudo which python

que devuelve /usr/bin/python en lugar. Utilizando la -E Opción da el mismo resultado.

¿Cómo puedo ejecutar un comando de python con root-right, pero con las variables de entorno conservadas? No quiero especificarlos todos con el comando sudo, y supongo que para 'copiar' solo el PATH Las variables deberían ser suficientes.

Pregunta formulada en otras palabras: ¿Cómo puedo ejecutar un comando de python con sudo, que tiene la misma PATH ¿Definición que tengo actualmente como usuario normal?

Alex
fuente
1
¿Edita / etc / sudoers para anular el env_reset y tal vez secure_path banderas de ayuda? Ver man 5 sudoers y aquí .
a CVn
Traté de incluir PATH en env_keep, pero no cambió el resultado de la prueba.
Alex

Respuestas:

0

Si usa el "! env_reset" Opción de desarmarlo y " ruta de seguridad "no está establecido en el archivo de su sudor, entonces las opciones" env_check "y" env_delete "puede eliminar que PATH esté exento de reinicio (es decir, funcionan como entradas de la lista negra).

Una causa más probable sería que un sistema / etc / bashrc o su propio .bashrc restablezca PATH a algún valor estándar (y no agregue a la ruta existente, según sea necesario).

En mi propio "sistema" bashrc (que mantengo en / etc / local y se llama después del sistema bashrc), me cuesta mucho no sobrescribir la ruta pasada con algunas funciones definidas al iniciar sesión:

# 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

Los llamo a través de:

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

Por supuesto, si el problema está en la base de su distribución, puede presentar un error ... ;-)

(Esto supone que no estás llamando a sudo con la "-i" que dice que debes comenzar con un nuevo entorno).

FWIW, al principio y al final de mis diversos archivos de perfil, bashrc y env y sus subarchivos ... Y en las versiones de mi distro (hay que leerlos en una actualización) Pongo estrofas de depuración que normalmente están inactivas. Al principio:

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

y punto:

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

Entonces, si necesito depurar un problema como este, puedo tocar / tmp / debug_local y creará inicios de sesión ruidosos para todos los usuarios en mi sistema (que normalmente solo soy yo en el sistema en el que tengo esto).

También de uso, si activa "-x" está cambiando su línea de PS4:

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

(Lo anterior es todo una línea, dividida con barras diagonales inversas - también es un comentario, es decir, no comentar)

Astara
fuente