Como eu executo comandos como um usuário não-root em um script iniciado com permissões de root?

3

O problema
Em um script bash, estou usando o comando ...

sudo -u node bash

.. para mudar de raiz para um usuário não-sudo, e isso está falhando.

O contexto
Estou escrevendo um script provision.sh para o Vagrant, para configurar um servidor rodando o Ubuntu 16.04.3 com todos os pacotes necessários para entregar um aplicativo com o Meteor 1.6.

Uma etapa obrigatória é instalar nvm como usuário não raiz. Depois que nvm estiver instalado, você precisará efetuar logout e login novamente para ativar nvm . Portanto, eu crio um usuário não sudo chamado meteor e quero mudar para isso quando eu baixar e instalar o nvm .

Posteriormente, quero voltar a ser root e efetuar login imediatamente como meteor , para começar a usar nvm para instalar o Node.js.

Você encontrará um script muito comentado abaixo. Vagrant executa este 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
    
por James Newton 20.11.2017 / 16:43

1 resposta

2

Se você iniciar seu script com permissões de root, mas precisar executar determinados comandos como um usuário não raiz específico, poderá usar sudo com a opção -u para executar um único comando com, por exemplo.

sudo -u USERNAME whoami # outputs USERNAME's user name

ou inicie um subshell e execute seus comandos nele, por exemplo:

sudo -u USERNAME bash -c 'whoami;echo $USER' # outputs USERNAME's user name twice

A linha em seu script não falha na verdade, você apenas executa bash como usuário meteor , e como bash não tem nada para fazer, apenas sai e o shell raiz original executa o restante do script . O que você realmente quer fazer (suponho) é:

…
echo "Trying sudo -u meteor bash"
sudo -u meteor bash -c '\
  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"
…

Outra maneira de alcançar o mesmo é um documento aqui :

…
echo "Trying sudo -u meteor bash"
sudo -u meteor bash <<EOF
  echo "$ whoami" && whoami && echo "^^^^^^ meteor expected"
  curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh |\
  bash
EOF
echo "ls -al /home/meteor/.nvm # should be populated"
…
    
por dessert 20.11.2017 / 17:21