Executando um comando sem herdar o ambiente do pai

10

Existe uma maneira de executar um comando "como se" estivesse em uma nova sessão de login?

Já experimentei env -i . No entanto, não quero lidar com várias variáveis ENV que preciso definir ou cancelar.

Eu também tentei bash -c "some command" e bash -l -c "some commmand" , mas todos eles copiam o ambiente atual.

O mais próximo que cheguei é uma solução de gueto: ssh me@localhost "some command"

    
por dgo.a 04.08.2011 / 16:49

2 respostas

4

Aqui está uma resposta que não requer privilégios sudo ou a senha do usuário, mas ainda fornece um ambiente como o que você obteria em um novo login.

env -i HOME="$HOME" bash -l -c 'your_command'

Exemplo:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

Quebrando isso para explicação:

  1. env -i HOME="$HOME" : apaga o ambiente. O -i configura um ambiente vazio com sem variáveis alguma . Isso é problemático porque significa que, se você tentar ingenuamente executar bash -l , ele não carregará seu .bash_profile etc. porque HOME não está definido. Para atenuar isso, passamos explicitamente HOME="$HOME" , criando um ambiente no qual HOME (e apenas HOME ) está definido.

  2. bash -l -c ... : Executa o comando desejado em um shell de login. Você vai querer um shell de login para isso, porque estamos começando de um ambiente limpo e precisamos recarregar tudo.

Notavelmente:

  • Isso não requer privilégios sudo (a versão sudo faz).
  • Isso não requer a digitação da senha do usuário (a versão su ).
  • Isso não requer a execução de um servidor SSH e uma chave sem senha que pode ser usada para efetuar login novamente na máquina (a versão ssh ).
por 22.06.2018 / 22:27
12
su -l $USER

sudo -u $USER -i

Para algo ainda mais agressivo, tente env -i bash , mas isso desativa tudo , incluindo $ HOME e $ TERM.

    
por 04.08.2011 / 17:17