Как создать скрипт, который запускает yum от имени пользователя root, а остальную часть скрипта — от имени вызывающего пользователя

Как создать скрипт, который запускает yum от имени пользователя root, а остальную часть скрипта — от имени вызывающего пользователя

У меня есть скрипт 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(строго говоря, это не изменит ваш логин, а запустит новую оболочку) —

newgrp docker

Чтобы это исправить,то естьв конечном итоге вы являетесь dockerсвоей основной группой, вам нужно управлять ею как вы сами; предполагая sudo,

su "${SUDO_USER}" -c "newgrp docker"

сделаю это.

Обратите внимание, что завершение вашего скрипта newgrpтаким образом означает, что ваш скрипт не заканчивается как таковой, когда вы получаете новое приглашение; результат будет таким:

  • оболочка, в которой вы находитесь, когда печатаетеsudo ./myscript.sh
    • sudo
      • оболочка работаетmyscript.sh
        • newgrp
          • оболочка началась с dockerтого, что была основной группой

Скрипт завершит работу только после выхода из оболочки, запущенной 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. Обратите внимание, однако, что пользователь должен иметь привилегии sudo для его корректного выполнения.

Связанный контент