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 ( su
neste 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'