Como fazer com que o `sudo` preserve o $ PATH?

123

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 sem problemas (exceto que ele falha porque precisa do sudo). No entanto, quando tento usar o sudo:

sudo godi_console

Estou tendo o erro a seguir

sudo: godi_console: command not found

A inspeção da variável PATH após o uso do sudo revela que não está incluindo o mesmo PATH que eu 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? Estou no Debian Jessie e, infelizmente, não consigo contornar o problema, passando sudo o link absoluto para godi_console, porque o próprio godi_console também depende do PATH ser configurado corretamente.

hugomg
fonte
2
Tente sudo -E godi_console. -Esignifica "preservar o meio ambiente".
21813 D13Bom
5
@D_Bye, isso não funcionará se secure_pathe / ou env_reset estiverem configurados como é o caso em muitas sudoimplantações como no Debian.
Stéphane Chazelas
@StephaneChazelas Obrigado pela informação - eu não uso o Debian, então talvez eu devesse ter ficado quieto!
D_Bye
Uma pergunta relacionada, sobre sunão sudo, é unix.stackexchange.com/questions/460478 .
JdeBP 10/03

Respostas:

149

Você sempre pode fazer:

sudo env "PATH=$PATH" godi_console

Como medida de segurança no Debian, /etc/sudoerstem a secure_pathopção definida como um valor seguro.

Observe que:

sudo "PATH=$PATH" godi_console

Onde sudotrata os argumentos principais que contêm =caracteres como atribuições de variáveis ​​de ambiente por si só, também funcionaria godi_consolecom o seu $PATH (em oposição ao secure_path) em seu ambiente, mas não afetaria sudoo caminho de pesquisa do executável, por isso não ajudaria a sudoencontrá-lo godi_console.

Stéphane Chazelas
fonte
5
Eu gosto desta resposta melhor, pois evita necessário alterar as configurações globalmente (ou seja, preserva o princípio do menor privilégio)
Alois Mahdal
5
sudo "PATH=$PATH" godi_console a propósito, não funcionou no CentOs7. Necessário o env #
Hakan Baba
1
@ StéphaneChazelas Alguma sudo "PATH=$PATH" godi_consolevez realmente funciona? sudoaceita VAR=valueargumentos, afetando o ambiente do comando que ele executa, mas diferente de envou bash, sudonão parece deixar isso afetar a maneira como ele pesquisa o comando. Eu só testei isso (recentemente) no Ubuntu 16.04. Mas tentei adicionar a exempt_groupopção sudoers(apenas para teste - não considero isso uma solução!) E os resultados foram esclarecedores. Os comandos do formulário PATH="$PATH" sudo some-commandcomeçaram a funcionar, mas os do formulário sudo PATH="$PATH" some-command ainda não.
Elias Kagan
2
@ballsatballsdotballs. Como esse alias deve afetar apenas seus shells interativos, isso deve ser relativamente inofensivo.
Stéphane Chazelas
2
Acabei de criar um alias chamado psudo para esses tipos de casos, onde: alias psudo = "sudo env \" PATH = $ PATH \ "". Então meu uso normal do sudo não é afetado.
MikeTronix 18/05/19
46

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ê desejar: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

michaelbn
fonte
18

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

Confira seu manual e opção chamada env_reset.

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

KWubbufetowicz
fonte
5
Legal! No Ubuntu, você pode visualizar e comentar as linhas secure_path e env_reset. Torna o sistema consideravelmente menos seguro, então tenha cuidado.
RawwrBag
Desativar env_resetparece não afetar sudoo comportamento de w / r / t PATH.
Zanna
5

Isso funciona :

sudo $(which your_command)

Exemplo de chamada do meu gpsscript que lista os processos da Nvidia GPU:

$ 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
SebMa
fonte
3
sudo --preserve-env=PATH env [command]

isso ultrapassa secure_path do meu lado

desenterrar
fonte
1

Isso funcionou:

sudo "PATH=$PATH" [your command]

Não altere $ PATH com o valor do caminho, basta escrever desta maneira

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

imane kichu
fonte
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 altera o PATH dentro do comando sudoed.

Edit: Eu não tenho certeza do que eu quis dizer com isso, como o acima é praticamente um absurdo. Use o seguinte:

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