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.


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.


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


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.


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

3
sudo --preserve-env=PATH env [command]

isso ultrapassa secure_path do meu lado


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....


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'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.