Por que o sudo não preserva meu ambiente?

5

Estou tentando sudo alguns binários que estão em um caminho personalizado. Esse caminho personalizado é removido quando eu executar sudo , mas sudo -E deve preservar meu caminho. Por que isso não funciona?

$ env | egrep ^PATH
PATH=/home/codemonkey/.nvm/v0.6.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/gam
es:/usr/games

$ sudo env | egrep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

$ sudo -E env | egrep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Eu sei como contornar isso, eu só quero saber porque sudo -E não funciona

    
por Hubro 04.02.2012 / 00:37

4 respostas

4

Você pode definir a opção exempt_group para informar ao sudo para manter o PATH para os usuários desse grupo.

Por exemplo, digamos que seu usuário esteja no grupo 'sys'. Adicione o seguinte ao seu arquivo sudoers

Defaults exempt_group="sys"

Agora seu usuário não terá PATH reset para comandos sudo ( -E não é necessário para que isso funcione). Veja a página de manual para mais detalhes.

EDIT: Vai ter que notar isso como uma resposta ruim. É verdade que funciona, mas tem um efeito colateral que eu não notei enquanto brincava com ele. Também isenta os usuários desse grupo de digitar sua senha. Parece que você não consegue preservar o PATH sem permitir isso. Pouco estúpido eu acho ...

    
por 05.02.2012 / 06:21
1

Propondo outra solução além da que eu já inseri. Isso funciona apenas para o bash (mas pode ser modificado para outros shells).

O seguinte é um wrapper em torno de sudo que irá procurar o comando que você está passando para ele. Depois de encontrar o comando, ele muda para o caminho completo.
Então, com efeito, sudo echo hello se torna sudo /bin/echo hello .

Coloque o seguinte no seu ~/.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[@]}" "$@"
}

Note que ele não será manipulado corretamente se você tiver um comando com um = em seu nome. Isso é extremamente improvável, então aceitei esta advertência para simplificar.

    
por 06.02.2012 / 16:35
1

De 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.
    
por 30.10.2015 / 14:29
0

Eu olharia para as opções no arquivo sudoers como eles controlam um pouco do comportamento do sudo.

E é claro que eu consultaria a página man do arquivo sudoers.

    
por 04.02.2012 / 00:40