如何创建一个以 root 身份运行 yum 的脚本,但以调用用户身份运行脚本的其余部分

如何创建一个以 root 身份运行 yum 的脚本,但以调用用户身份运行脚本的其余部分

我有一个 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意味着当您收到新提示时,脚本不会这样结束;结果是

  • 当你打字时你所在的 shellsudo ./myscript.sh
    • sudo
      • 外壳正在运行myscript.sh
        • newgrp
          • shell 开始时docker作为主要组

仅当您退出由 启动的 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 权限才能正确执行。

相关内容