
У меня есть скрипт 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 для его корректного выполнения.