我有一个 bash 脚本,它使用 yum 安装一些 Docker 相关的实用程序,自然 yum 需要 sudo 访问权限。所以我通过以下方式运行脚本:
sudo ./myscript.sh
但脚本完成后最终将我的用户更改为 root。这对我来说是一个问题,因为我希望脚本末尾通过以下方式将运行它的用户添加到 Docker 用户组:
groupadd docker
gpasswd -a $USER docker
因此,当脚本完成时,它将 root 而不是当前用户添加到组中 - 我想这是因为我使用 sudo 运行它。
是否可以 sudo 运行脚本但保留当前用户的登录名?据我了解,在脚本中使用 sudo 通常不是一个好主意。
这是脚本(在下面的答案后编辑):
#!/bin/bash
yum remove docker \
docker-common \
container-selinux \
docker-selinux \
docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce
systemctl start docker
groupadd docker
groupadd docker
gpasswd -a "${SUDO_USER}" docker
su "${SUDO_USER}" -c "newgrp docker"
答案1
您可以检查该SUDO_USER
变量来确定脚本是否正在运行通过 sudo
,如果是,哪个用户运行了它。然后你只需在以下位置使用它gpasswd
:
gpasswd -a "${SUDO_USER}" docker
或者
gpasswd -a "${SUDO_USER-$USER}" docker
如果你想USER
在没有 的情况下退回到SUDO_USER
.
导致您最终登录的命令root
(严格来说,这不会更改您的登录名,它会运行一个新的 shell)是
newgrp docker
为了解决这个问题,IE作为docker
你的主要团队,你需要以你自己的方式来管理它;假设sudo
,
su "${SUDO_USER}" -c "newgrp docker"
会这样做。
请注意,以这种方式结束脚本newgrp
意味着当您收到新提示时,脚本不会这样结束;结果是
- 当你打字时你所在的 shell
sudo ./myscript.sh
sudo
- 外壳正在运行
myscript.sh
newgrp
- shell 开始时
docker
作为主要组
- shell 开始时
- 外壳正在运行
仅当您退出由 启动的 shell 时,该脚本才会退出newgrp
。
答案2
如果使用 sudo 通常被认为是一种好的做法,并且如果使用它(尤其是在需要手动执行的简短脚本中)简化了逻辑或维护并实现了预期的目标,那么我会说在脚本中使用 sudo即使不是优选的,也是适当的。
可以在脚本中使用 sudo,并以普通用户身份运行脚本。调用的 sudo 通常会要求输入密码,仅一次(或者如果用户最近使用过 sudo,则根本不会)。但是,为了实现正确的行为,脚本应阻止用户以 root 身份运行它。
# This should not be run as root (or using 'sudo')
if [ "$(/usr/bin/id -u)" == "0" ] ; then
echo "This script cannot be run as root (or using 'sudo')!" 1>&2
exit 1
fi
# Use sudo per command here
sudo groupadd docker
sudo gpasswd -a $USER docker
在这里,由于 $USER 变量对应于普通用户,因此它将作为 gpasswd 的预期参数插入。
该示例将以普通用户身份运行;不是须藤。但请注意,用户必须具有 sudo 权限才能正确执行。