O problema
Em um script bash, estou usando o comando...
sudo -u node bash
.. para mudar de root para um usuário não-sudo, e isso está falhando.
O contexto
Estou escrevendo um provision.sh
script para Vagrant, para configurar um servidor rodando Ubuntu 16.04.3 com todos os pacotes necessários para entregar um app com Meteor 1.6.
Uma etapa necessária é instalar nvm
como um usuário não root. Depois nvm
de instalado, você precisa sair e entrar novamente para ativar o nvm
. Portanto, crio um usuário não-sudo chamado meteor
, e quero mudar para ele quando baixar e instalar nvm
.
Posteriormente, quero voltar a ser root
e fazer login imediatamente como meteor
, a fim de começar a usar nvm
para instalar o Node.js.
Você encontrará um script muito comentado abaixo. O Vagrant executa esse script toda vez que eu chamo vagrant reload --provision
.
Qual comando devo usar em vez de sudo -u node bash
?
echo "# whoami" && whoami && echo "^^^^ root expected"
echo "As root, create non-sudo user meteor:"
pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
useradd -m -p $pass meteor
echo "User meteor created. ls -al /home/meteor:"
ls -al /home/meteor
echo "Install curl as root:"
apt-get install -y curl
echo "Trying sudo -u meteor bash"
sudo -u meteor bash #### THIS IS THE LINE THAT FAILS ###
echo "$ whoami" && whoami && echo "^^^^^^ meteor expected"
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
echo "ls -al /home/meteor/.nvm # should be populated"
ls -al /home/meteor/.nvm
echo "ls -al /root/.nvm # should not exist"
ls -al /root/.nvm
echo "command -v nvm will fail silently until we log out and back in again"
#command -v nvm
exit
#### Because the script is still running as root, it halts here ####
echo "# whoami" && whoami && echo "^^^^ should be root"
sudo -u meteor bash
echo "$ whoami" && whoami && echo "^^^^^^ should be meteor"
echo "command -v nvm should work now"
command -v nvm
Se você iniciar seu script com permissões de root, mas precisar executar determinados comandos como um usuário não root específico, poderá usar
sudo
com a-u
opção de executar um único comando com, por exemploou inicie um subshell e execute seus comandos nele, por exemplo:
A linha em seu script não falha, na verdade, você apenas executa apenas
bash
como usermeteor
e, comobash
não tem nada a ver, apenas sai e o shell raiz original executa o restante do script. O que você realmente quer fazer (suponho) é:Outra maneira de conseguir o mesmo é um documento aqui :
Se você estiver em um ambiente de contêiner, o projeto gosu pode ser interessante. Destina-se a resolver o problema de que su e sudo têm TTY muito estranho e muitas vezes irritante e comportamento de encaminhamento de sinal.
Algumas boas alternativas são mencionadas no README.md do projeto gosu:
chroot --userspec
já pode estar instaladosu-exec
https://github.com/ncopa/su-execsetpriv
do pacote util-linux (Debian) https://manpages.debian.org/buster/util-linux/setpriv.1.en.html