sudo como outro usuário com seu ambiente

43

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

Por que o $HOME não está sendo definido como /home/otheruser , embora o bash seja chamado como um shell de login?

Especificamente, /home/otheruser/.bashrc não está sendo originado. Além disso, /home/otheruser/.profile não está sendo originado. - ( /home/otheruser/.bash_profile não existe)

EDITAR: O problema exato é, na verdade, link

    
por user80551 02.01.2015 / 05:29

2 respostas

67

Para invocar um shell de login usando sudo , use apenas -i . Quando o comando não for especificado, você receberá um prompt de login, caso contrário, você obterá a saída do seu comando.

Exemplo (shell de login):

sudo -i

Exemplo (com um usuário especificado):

sudo -i -u user

Exemplo (com um comando):

sudo -i -u user whoami

Exemplo (usuário de impressão $HOME ):

sudo -i -u user echo \$HOME

Nota: O caractere de barra invertida garante que o sinal de dólar atinja o shell do usuário de destino e não seja interpretado no shell do usuário de chamada.

Acabei de verificar o último exemplo com strace , que informa 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 em sua chamada explícita para bash, mas além disso, sudo pode fazer seu próprio trabalho, como configurar o $HOME .

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \$HOME"], [/* 16 vars */]) = 0
...

Notei que você está usando -S e não acho que seja uma boa técnica. Se você deseja executar comandos como um usuário diferente sem executar a autenticação do teclado, convém usar o SSH. Ele funciona para localhost , bem como para outros hosts e fornece autenticação de chave pública que funciona sem nenhuma entrada interativa.

ssh user@localhost echo \$HOME

Nota: Você não precisa de nenhuma opção especial com SSH, pois o servidor SSH sempre cria um shell de login para ser acessado pelo cliente SSH.

    
por 02.01.2015 / 09:27
10

Você está dando muito crédito a Bash. Todos os "shell de login" significa que o Bash é o que os arquivos são originados na inicialização e desligamento. A variável $HOME não figura nela.

Os documentos do Bash explicam mais o que significa shell de login: link

Na verdade, o Bash não faz nada para definir $HOME . $HOME é definido pelo que invoca o shell (login, ssh, etc.) e o shell o herda. O que quer que tenha iniciado seu shell como admin, defina $HOME e, em seguida, exec-ed bash , sudo por design não altere o ambiente a menos que seja solicitado ou configurado para fazer isso, então bash como otheruser herdou do shell.

Se você quiser que sudo manipule mais do ambiente da maneira esperada, veja a opção -i do sudo. Experimente:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

A página man do sudo descreve isso com mais detalhes, embora não muito bem, eu acho: link

    
por 02.01.2015 / 09:04