Como fazer o 'sudo' preservar o $ PATH?

106

Eu preciso executar um programa instalado em / opt / godi / sbin (um diretório personalizado). Se eu adicionar esse diretório ao meu PATH, adicionando a seguinte linha ao meu arquivo .bashrc

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

então eu posso tentar executar o comando muito bem (exceto que ele falha porque precisa de sudo). No entanto, quando tento usar o sudo:

sudo godi_console

Eu recebo o seguinte erro

sudo: godi_console: command not found

Inspecionar a variável PATH depois de usar o sudo revela que ela não inclui o mesmo PATH que tenho como usuário normal:

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Por que o PATH não é o mesmo? Estou fazendo algo errado? Eu estou no Debian Jessie e infelizmente não consigo contornar o problema passando sudo o link absoluto para godi_console porque godi_console em si também depende de o PATH estar corretamente configurado.

    
por hugomg 16.07.2013 / 10:20

7 respostas

126

Você sempre pode fazer:

sudo env "PATH=$PATH" godi_console

Como medida de segurança no Debian, /etc/sudoers tem a opção secure_path definida como um valor seguro.

Observe que:

sudo "PATH=$PATH" godi_console

Onde sudo trata os argumentos principais contendo = caracteres como atribuições de variável de ambiente, também funcionaria na execução de godi_console com seu $PATH (em oposição a secure_path ) em seu ambiente, mas não afetaria o caminho de busca de sudo para executável, então não ajudaria sudo ao descobrir que godi_console .

    
por 16.07.2013 / 11:12
41

Você também pode definir o PATH padrão em /etc/sudoers

edite o arquivo usando visudo

e atualize a linha para o que você quiser: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

    
por 20.08.2014 / 17:37
16

O SUDO está redefinindo as variáveis env por padrão.

Confira o manual e a opção chamada env_reset.

Você só precisa desativá-lo em / etc / sudoers.

    
por 16.07.2013 / 20:21
2

Isso funciona:

sudo $(which your_command)

Exemplo de chamada do meu script gps , que lista os processos da GPU da Nvidia:

$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
  PID TTY          TIME CMD
 9922 tty7     02:42:47 Xorg

Explicação:

$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
  PID TTY          TIME CMD
 9922 tty7     02:42:39 Xorg
+ set +x
    
por 28.05.2018 / 15:25
2
sudo --preserve-env=PATH env [command]

isto ovverrides secure_path no meu fim

    
por 09.11.2018 / 15:09
1

Isso funcionou:

sudo "PATH=$PATH" [your command]

Não altere o $ PATH com o valor do seu caminho, apenas escreva desta forma

exemplo: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....

    
por 18.09.2018 / 15:09
0

Talvez não seja exatamente o que o OP pede, mas isso pode ajudar:

sudo -u the_user PATH=$PATH:/opt/godi/bin sh -c 'echo $PATH'

Isso muda o PATH dentro do comando sudoed.

Edit: Eu não tenho certeza do que eu quis dizer com isso, já que o acima é um absurdo. Use o seguinte em vez disso:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
    
por 06.05.2018 / 15:45

Tags