sudo, runuser, su não funcionam como esperado quando executado como root com o comando "echo $HOME"

sudo, runuser, su não funcionam como esperado quando executado como root com o comando "echo $HOME"

Quando executo esses comandos, a saída é conforme mostrado. /raiz

$ sudo -u someuser -i "echo $HOME"
/root
$ runuser -l someuser -c "echo $HOME"
/root    
$ su - someuser -c "echo $HOME"
/root

O que eu esperava era

/home/someuser

Quando executo o comando env para inspecionar o ambiente, ele reporta a variável HOME corretamente.

$ su - someuser -c "env"
...  
HOME=/home/someuser
...

$ sudo -u someuser -i "env"  
...  
HOME=/home/someuser
...

$ runuser -l someuser -c "env"  
...  
HOME=/home/someuser
...  

O que eu quero fazer é executar scripts no diretório inicial dos usuários. /home/someuser/scripts.
como ${HOME}/scripts/somescript.sh

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
sudo: /root/scripts/somescript.sh: command not found  

O que eu esperava era:

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
...
script output.
...

Responder1

Relacionado tangencialmente:

sudo -u someuser -i "echo $HOME"

não funciona para mim. Diz:

-bash: echo $HOME: command not found

Direto ao ponto: quando você executa o comando

sudo -u someuser -i echo $HOME

a variável $HOMEé expandida pelo shell antes mesmo de o sudo ser executado.

Para resolver isso, você poderia usar um comando como

sudo -u someuser -i bash -c 'echo $HOME'

Neste comando, echo $HOMEé enviado literalmente para o bash após trocar o UID.

O resultado é o esperado:

/home/someuser

Responder2

Quando você faz

 su - someuser -c "echo $HOME"

Oatualshell expande $HOMEprimeiro, então o resultado é passado para o comando ( suneste caso) e daí para um processo shell sendo executado como o novo usuário.

Tente proteger a variável com aspas simples

 su - someuser -c 'echo $HOME'

informação relacionada