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:
- Prefixe o local do python desejado à variável
$PATH
usando algo comoexport PATH=/path/to/foo:$PATH
- 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
.