如何在以root权限启动的脚本中以非root用户身份运行命令?

问题
在bash脚本中,我正在使用命令…

sudo -u node bash 

..从root用户切换到非sudo用户,这是失败的。

上下文
我正在为Vagrant编写一个provision.sh脚本,用于设置运行Ubuntu 16.04.3的服务器,其中包含使用Meteor 1.6交付应用程序所需的所有软件包。

一个必需步骤是将nvm作为非root用户安装。 安装nvm后,您需要注销并重新登录才能激活nvm 。 因此,我创建了一个名为meteor的非sudo用户,并希望在下载并安装nvm时切换到该nvm

随后,我想切换回root并立即以meteor身份登录,以便开始使用nvm来安装Node.js.

你会在下面找到一个评论很多的剧本。 每次我调用vagrant reload --provision时,Vagrant都会运行此脚本。

我应该使用什么命令而不是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 

如果您使用root权限启动脚本但需要以特定的非root用户身份运行某些命令,则可以使用带-u选项的sudo来运行单个命令,例如

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

或者启动子shell并在其中运行命令,例如:

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

你的脚本中的行实际上并没有失败,你只是将bash作为用户meteor运行,而bash无所事事只是退出而原始root shell运行脚本的其余部分。 你真正想做的事(我想)是:

 … 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" … 

另一种实现相同目标的方法是:

 … echo "Trying sudo -u meteor bash" sudo -u meteor bash <