Executando um comando sem herdar o ambiente do pai

14

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

Eu já tentei env -i. No entanto, não quero lidar com várias variáveis ​​ENV que tenho que definir ou desarmar.

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 é de uma solução do gueto: ssh me@localhost "some command"

dgo.a
fonte
Use /bin/bash --loginpara obter esse comportamento. Eu uso, por exemplo, para obter um bom $PATH.
Daniel Beck
Isso é o equivalente a /bin/bash --l, que eu já tentei. Ele copia o ambiente original. Experimente: export SOME_VAL=something. Então /bin/bash --login. Então env | grep SOME_VAL. O valor estará lá.
dgo.a

Respostas:

12

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

Analisando isso como explicação:

  1. env -i HOME="$HOME": Limpa o ambiente. As -iconfigura um ambiente vazio com nenhuma variável de qualquer natureza . Isso é problemático porque significa que, se você tentar executar ingenuamente bash -l, não carregará o seu .bash_profileetc. porque HOMEnão está definido. Para mitigar isso, passamos explicitamente HOME="$HOME", criando um ambiente em que HOME(e somente HOME) está definido.

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

Notavelmente:

  • Isso não requer privilégios sudo (a sudoversão exige ).
  • Isso não requer digitar a senha do usuário (a suversão exige ).
  • Isso não requer a execução de um servidor SSH e a existência de uma chave sem senha que pode ser usada para efetuar login novamente na máquina (a sshversão exige ).
Elliott Slaughter
fonte
Obrigado, Elliott. Parece tão simples e óbvio ... agora que foi apontado para mim.
dgo.a
12
su -l $USER

sudo -u $USER -i

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

user1686
fonte
2
Obrigado! O segundo comando me dá exatamente o que eu quero. Pesquisei por mais de duas horas e não encontrei nada próximo da sua resposta. Com base na sua resposta, voltei man sudoe encontrei: "se o usuário de destino for o mesmo que o usuário que está chamando, nenhuma senha será necessária." ( suParece que sempre pede uma senha.) Eu sou tão idiota por ter esquecido algo tão simples no primeiro parágrafo de uma manpágina :( Evitei o sudo em primeiro lugar porque presumi que sempre pedia uma senha. Obrigado novamente!
dgo.a
1
apenas uma dica para outras pessoas ... se você estiver conectado $USER, precisará fazer login como root e depois sudo -u ...como usuário. Se você apenas fizer sudo -ucomo usuário, herdará.
Adam Gent
isso não funciona, obviamente, se você não tiver sudoacesso. Existe um método alternativo que não requer sudo?
user5359531
@ user5359531: Sim - su -l $USER.
user1686
1
que pede uma senha; Estou logado através da autenticação de chave ssh, então nem sei qual é a senha. E um prompt de senha vai matar a capacidade de script. Até agora, sua aparência ssh $USER@localhost <command>está funcionando melhor
user5359531 12/12