executando o comando com o ambiente “default”

0

Esta questão link sugere que podemos executar um comando sem herdando o ambiente dos pais por

$ sudo -u "'whoami'" $COMMAND

Existem maneiras de fazer isso sem usar sudo ? Como sudo é muito popular, ainda não atingiu o status portátil (ou em POSIX).

Eu tentei env -i $COMMAND , mas não é bom, pois remove todas as variáveis de ambiente. O que eu quero é executar o comando no ambiente padrão .

    
por Alex Vong 07.09.2018 / 18:01

1 resposta

2

login(1) tradicionalmente define um conjunto limitado de variáveis de ambiente em, bem, o tempo de login. Como su login normalmente solicitará uma senha, mesmo que uma delas faça login como se, de modo que provavelmente não seja o ideal. Os sistemas Unix podem ter complicações adicionais ou diferentes, e. se houver PAM pam_env(8) poderia adicionar ou remover variáveis de ambiente do que foi definido por login . Uma cópia de qual login(1) poderia, assim, criar um conjunto de variáveis de ambiente diferente do que um login real através de conjuntos de PAM.

Depois, há terminais e shells; terminais podem ou não iniciar o processo subsequente como um shell de "login". Os shells podem ler arquivos diferentes quando sinalizados como login e podem acabar com diferentes variáveis env para instâncias de login versus não-login. Existe literatura sobre esse assunto .

Portanto, com base no unix, no processo de login, na configuração do sistema local, no shell usado pelo usuário e na configuração local desse shell, pode haver diferentes variáveis de ambiente definidas "por padrão".

Você pode conseguir uma lista adequada de variáveis de ambiente com uma instância de shell de login:

% export CANARY=tweet
% env -i bash -l -c 'env | grep CANARY'
/Users/jhqdoe/.profile: line 6: set: markdirs: invalid option name
% 

isso limpa as variáveis de ambiente do processo pai ( env | grep CANARY seria onde o $COMMAND seria). .profile aqui é, na verdade, para mksh , não bash . No entanto, o acima pode não definir as variáveis necessárias que o fluxo de trabalho de login define, pois ele não passa por esse código. Eles podem ser inspecionados para ver o que estão com um novo login e, em seguida, executar:

$ env > def
$ env -i bash -l -c 'env > new'

E, em seguida, comparar os arquivos def e new para ver como eles diferem (possivelmente envolvendo os comandos sort e diff ), possivelmente atualizando o comando env para definir os itens que foram perdidos antes então fazendo o shell de login.

Outra ideia é tirar um instantâneo do ambiente e usá-lo como padrão.

    
por 07.09.2018 / 20:20