Sudo - ambiente do usuário de destino

1

Existe uma maneira (sem saltar muitos arcos) para executar sudo -u user command de tal forma que o ambiente user seja inteiramente preservado?

Basicamente, o que eu preciso é garantir que variáveis de ambiente específicas sejam definidas para todos os usuários autorizados a executar o sudo para representar certos IDs - principalmente coisas como PATH , JAVA_HOME e variáveis relacionadas ao banco de dados (Oracle e Postgres) .

Em outras palavras, quando eu, como usuário wobble , executar sudo -u wibble echo $PATH , gostaria de ver o caminho de wibble exibido em vez de wobble .

    
por Eugenio Mastroviti 31.08.2016 / 15:01

2 respostas

2

Você pode fazer o seguinte para todos os usuários ou um determinado usuário wobble no entanto, aplica-se a todos os comandos sudo -u anyuser . Edite o arquivo /etc/sudoers e adicione uma linha como

Defaults env_keep+="PATH JAVA_HOME"

para todos os usuários ou

Defaults:wobble env_keep+="PATH JAVA_HOME"

para apenas wobble, com todas as variáveis que você deseja manter. Na verdade, PATH geralmente é um caso especial e é redefinido, portanto, talvez seja necessário cancelá-lo com uma entrada como

Defaults:wobble  !secure_path, env_keep+="PATH JAVA_HOME"

Obviamente, esses recursos estão lá por um bom motivo, então tome cuidado.

Há também a capacidade de preservar o ambiente com sudo -E , que pode ser permitido por uma entrada de sudoers como:

wobble ALL = (wibble) SETENV: ALL

mas isso ainda irá redefinir o caso especial PATH, embora você possa executar comandos como

sudo -E PATH=$PATH -u wibble ...
    
por 31.08.2016 / 15:26
0

Você pode usar sudo -i para percorrer os processos de login completos para um usuário, portanto, sudo -i -u wibble command fará login como wibble, configurará todos os seus vars de ambiente e executará o comando como esse usuário.

No entanto, sudo -i -u wibble echo $HOME ainda imprime seu caminho inicial. Isto é porque o seu prompt está expandindo o $ HOME var antes mesmo do sudo ser iniciado e não há nada que o sudo possa fazer sobre isso. Então, se você precisar passar uma variável de ambiente através da linha de comando, ela deve ter um escape adequado, aqui estão alguns exemplos:

sudo echo $HOME
> /home/user
sudo -i echo '$HOME'
> /root
sudo echo '$HOME'
> $HOME
sudo bash -c 'echo $HOME'
> /root
sudo -i bash -c 'echo $HOME'
> /root

Para todos esses, você pode adicionar -u wibble (antes do comando) para executá-los como wibble.

    
por 31.08.2016 / 18:31