sudo -u não obtendo o caminho acrescentado em $ HOME / .profile

1

Eu tenho como script que requer privilégios de root. Eu corro o script usando sudo ./script.sh . Algumas partes do script precisam ser executadas como o usuário original, então eu uso sudo --user=$SUDO_USER dentro do script para fazer esse trabalho. O problema que estou tendo é que eu tenho alguns utilitários instalados para o usuário, e seu caminho é anexado ao $ PATH no meu ~/.profile . Tenho a sensação de que ~ / .profile não é executado quando executado como sudo, confirmado por sudo --user=$SUDO_USER echo $PATH .

Eu posso contornar isso ao pesquisar $ HOME / .profile, mas isso não parece ser a solução certa:

sudo --user=$SUDO_USER source $HOME/.profile; command_i_want_to_run

Devo acrescentar meu $ PATH em um arquivo diferente para disponibilizá-lo, independentemente do contexto?

    
por Pete 23.01.2018 / 02:02

2 respostas

1

A razão pela qual bashrc ou arquivos de configuração similares não são originados, é que o sudo não executa um shell. Ele realmente bifurca o processo e faz algumas outras coisas - portanto, não está necessariamente relacionado a um shell. Se você quiser ler isso com mais detalhes, procure por Process model em man sudo .

Posso pensar em duas opções sensatas que estão disponíveis para você:

  1. Você pode dizer ao sudo para usar um shell de login
  2. Você pode executar o bash usando o sudo e dizer ao bash para ser um shell de login

Os dois conseguem a mesma coisa de uma maneira um pouco diferente.

Opção 1: sudo --user=baam -i echo '$PATH' dirá ao sudo para iniciar o shell padrão de baam e executar echo $PATH . Observe as aspas em torno de $PATH no comando original, caso contrário, ele será expandido antes que o bash o veja.

Opção 2: sudo --user=baam bash -c -l 'echo $PATH' usará o sudo para executar o bash. O -l sinalizador diz ao bash para agir como um shell de login, então ele irá fornecer .profile . Esta é a melhor solução na minha opinião, porque você também pode especificar outro shell que suporte o -l flag, como zsh , então você é mais flexível no geral.

    
por 23.01.2018 / 02:51
2

Não tenho certeza se isso depende da política de sudoers locais, mas pelo menos no meu sistema Ubuntu você pode usar a opção sudo -i ou --login para especificar um shell de login:

 -i, --login
             Run the shell specified by the target user's password data‐
             base entry as a login shell.  This means that login-specific
             resource files such as .profile or .login will be read by the
             shell.

Então, por exemplo

$ sudo sudo -u steeldriver sh -c 'echo $PATH'
[sudo] password for steeldriver: 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

mas

$ sudo sudo -iu steeldriver sh -c 'echo $PATH'
/home/steeldriver/bin:/home/steeldriver/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
    
por 23.01.2018 / 02:46