$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin
Por que não está $HOME
sendo definido como o /home/otheruser
bash é chamado como um shell de logon?
Especificamente, /home/otheruser/.bashrc
não está sendo originado. Além disso, /home/otheruser/.profile
não está sendo fornecido. - ( /home/otheruser/.bash_profile
não existe)
EDIT: o problema exato é realmente https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails
bash
sudo
environment-variables
user80551
fonte
fonte
Respostas:
Para chamar um shell de login usando
sudo
apenas use-i
. Quando o comando não for especificado, você receberá um prompt de shell de login, caso contrário, obterá a saída do seu comando.Exemplo (shell de login):
Exemplo (com um usuário especificado):
Exemplo (com um comando):
Exemplo (usuário de impressão
$HOME
):Nota: O caractere de barra invertida garante que o cifrão alcance o shell do usuário de destino e não seja interpretado no shell do usuário que está chamando.
Acabei de verificar o último exemplo com strace, que diz exatamente o que está acontecendo. A saída abaixo mostra que o shell está sendo chamado com
--login
e com o comando especificado, assim como na sua chamada explícita para o bash, mas, além disso, o sudo pode fazer seu próprio trabalho, como definir o$HOME
.Notei que você está usando
-S
e geralmente não acho que seja uma boa técnica. Se você deseja executar comandos como um usuário diferente sem executar autenticação no teclado, pode usar o SSH. Ele funciona paralocalhost
outros hosts e fornece autenticação de chave pública que funciona sem nenhuma entrada interativa.Nota: Você não precisa de opções especiais com o SSH, pois o servidor SSH sempre cria um shell de login para ser acessado pelo cliente SSH.
fonte
sudo -i -u user echo \$HOME
não funciona para mim. Saída:$HOME
. strace fornece a mesma saída que a sua. Qual é o problema?Você está dando muito crédito ao Bash. Todo "shell de login" significa para o Bash quais arquivos são originados na inicialização e no desligamento. A
$HOME
variável não aparece nela.Os documentos do Bash explicam um pouco mais o que significa shell de login: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files
De fato, Bash não faz nada para definir
$HOME
.$HOME
é definido pelo que chama o shell (login, ssh, etc.), e o shell o herda. O que quer que tenha iniciado seu shell como administrador definido$HOME
e depois executadobash
,sudo
por padrão, não altera o ambiente, a menos que seja solicitado ou configurado para fazê-lo, assimbash
como outro usuário o herdou do seu shell.Se você deseja
sudo
lidar com mais do ambiente da maneira que espera, veja o-i
switch sudo. Experimentar:A página de manual do sudo descreve mais detalhadamente, embora não muito bem, eu acho: http://linux.die.net/man/8/sudo
fonte
/bin/bash -l -c 'echo $HOME'
linha de comando quando estiver usando-i
.sudo
sintaxe gerou um erro na minha máquina. (su
usa a-c
opção, mas acho quesudo
não.) Tive melhor sorte com:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
-S
(eu não precisava, então deixei de fora), mas-c
não funciona aqui, você precisa-s
.