如何在以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 <