问题
在 bash 脚本中,我正在使用命令...
sudo -u node bash
..从root切换到非sudo用户,这是失败的。
我正在provision.sh
为 Vagrant 编写脚本,以设置运行 Ubuntu 16.04.3 的服务器,其中包含使用 Meteor 1.6 交付应用程序所需的所有包。
一个必需的步骤是以nvm
非 root 用户身份安装。安装完成后nvm
,您需要注销并重新登录才能激活nvm
。因此,我创建了一个名为 的非 sudo 用户meteor
,并希望在下载和安装时切换到该用户nvm
。
随后,我想立即切换回原来的root
登录方式meteor
,以便开始使用nvm
安装Node.js。
您会在下面找到一个注释很多的脚本。每次我调用 Vagrant 都会运行这个脚本vagrant reload --provision
。
我应该使用什么命令而不是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 用户身份运行某些命令,则可以使用
sudo
选项-u
来运行单个命令,例如或启动一个子shell并在其中运行您的命令,例如:
您的脚本中的行实际上并没有失败,您只是
bash
以 user身份运行meteor
,并且bash
无事可做,它只是退出,原始的 root shell 运行脚本的其余部分。你真正想做的(我想)是:实现相同目的的另一种方法是此处的文档:
如果您在容器环境中,gosu 项目可能会很有趣。它旨在解决 su 和 sudo 具有非常奇怪且经常令人讨厌的 TTY 和信号转发行为的问题。
gosu 项目的 README.md 中提到了一些不错的替代方案:
chroot --userspec
可能已经安装su-exec
https://github.com/ncopa/su-execsetpriv
来自 (Debian) util-linux 软件包https://manpages.debian.org/buster/util-linux/setpriv.1.en.html