Como adicionar / modificar o PATH para o sudo?

0

Eu instalei duas versões do Python.

  • Python 2.7.14 em /usr/local/bin
  • Python 2.7.5 em /usr/bin .

Quando digito # python , ele usa a versão 2.7.14 , mas quando digito sudo python , ele usa a versão 2.7.5 . Como posso fazer sudo python apontar para a versão 2.7.14 ?

Na saída de sudo env | grep PATH , /usr/local/bin aparece antes de /usr/bin , mas ainda está pegando o Python em /usr/bin .

PATH=/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Quando eu digito sudo su para entrar no shell de root, ele me dá python 2.7.14 , mas na mesma sessão se eu digitar sudo python , ele me dá python 2.7.5 .

Eu passei por essa pergunta mas a resposta aceita não responde como garantir que o sudo use o caminho correto.

Veja como o caminho seguro se parece:

secure_path = /usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
por Manoj 09.01.2018 / 05:16

1 resposta

0

Esta é definitivamente uma questão sudo e GNU/Linux , não é realmente uma questão Python . Quando você executa sudo foo arg1 arg2 , o sistema inicializa primeiro um shell (aquele definido para raiz, não para você) que está sendo executado como root e, em seguida, "executa" foo arg1 arg2 . Não é exatamente o mesmo que fazer login em root e digitar foo arg1 arg2 na linha de comando, mas fechar. Existem executáveis que não permitem que um usuário sudo rode ou faça algumas coisas e algumas variáveis de ambiente adicionais configuradas para você, que você pode ver se você executar sudo env . Você verá algo como:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PS1=%%
PS2=cont>
MAIL=/var/mail/root
LOGNAME=root
USER=root
USERNAME=root
HOME=/root
SHELL=/bin/bash
SUDO_COMMAND=/usr/bin/env
SUDO_USER=my_user
SUDO_USER=spt
SUDO_UID=1000
SUDO_GID=1000
SUDO_COMMAND=/usr/bin/env

E se o shell for bash, o subshell provavelmente lerá o conteúdo de /root/.bashrc se ele existir. Além disso, o my_user bash shell fará expansão de alias no primeiro item (ou seja, o sudo em sudo foo arg1 arg2 ) e não o segundo ( foo ). Portanto, se foo também for um alias, ele não será expandido e, portanto, a subshell em execução como root tentará executar foo como literal e não foo como o alias criado sob my_user . Existem algumas maneiras de "corrigir" seu problema. Um define um alias para sudo com um espaço à direita:

alias='sudo '

Como explicado aqui , isso causará o que vem depois de sodo para ser também alias-expandido antes de enviá-lo para o subshell para ser executado.

Outra opção é editar o arquivo /root/.bashrc ou equivalente e fazer uma das seguintes ações:

  1. Prefixe o local do python desejado à variável $PATH usando algo como export PATH=/path/to/foo:$PATH
  2. Defina o alias que você quer lá

Ou, você pode fazer algo (levemente) arriscado e preguiçoso, mas altamente eficaz e apenas executar sudo (cd /root && ln -s /home/my_user/.bashrc) e root sempre irão apenas fornecer o arquivo my_user/.bashrc .

    
por 11.01.2018 / 17:09