
Eu tenho um script bash que usa o yum para instalar alguns utilitários relacionados ao Docker e, naturalmente, o yum precisa de acesso ao sudo. Então eu executo o script via:
sudo ./myscript.sh
Mas o script acaba mudando meu usuário para root depois de concluído. Isso é um problema para mim, porque quero que o final do script adicione o usuário que o executa ao grupo de usuários do Docker por meio de:
groupadd docker
gpasswd -a $USER docker
Assim, quando o script termina, ele adiciona root ao grupo em vez do usuário atual - imagino que seja porque eu o executo com o sudo.
É possível executar um script sudo, mas manter o login do usuário atual? Pelo que entendi, geralmente não é uma boa ideia usar sudo em scripts.
Aqui está o script (editado após as respostas abaixo):
#!/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"
Responder1
Você pode verificar a SUDO_USER
variável para determinar se o script está sendo executadoatravés da sudo
e, em caso afirmativo, qual usuário o executou. Então você apenas usaria isso em gpasswd
:
gpasswd -a "${SUDO_USER}" docker
ou
gpasswd -a "${SUDO_USER-$USER}" docker
se você quiser voltar USER
na ausência de SUDO_USER
.
O comando que faz com que você termine logado como root
(estritamente falando, isso não altera seu login, ele executa um novo shell) é
newgrp docker
Para consertar isso,ou sejaacabe sendo você mesmo docker
como seu grupo principal, você precisa administrá-lo como você mesmo; assumindo sudo
,
su "${SUDO_USER}" -c "newgrp docker"
fará isso.
Observe que terminar seu script newgrp
dessa maneira significa que ele não termina assim quando você recebe um novo prompt; o resultado é
- o shell em que você está quando digita
sudo ./myscript.sh
sudo
- o shell funcionando
myscript.sh
newgrp
- o shell começou
docker
como o grupo primário
- o shell começou
- o shell funcionando
O script só será encerrado quando você sair do shell iniciado por newgrp
.
Responder2
Se o uso do sudo for geralmente considerado uma boa prática, e se usá-lo - especialmente dentro de um script curto destinado a ser executado manualmente - simplifica a lógica ou a manutenção e atinge o objetivo desejado, então eu diria o uso do sudo dentro de um script é apropriado, se não preferível.
É possível usar sudo dentro do script e executar o script como um usuário normal. O sudo invocado normalmente solicitará uma senha, apenas uma vez (ou não solicitará nenhuma senha se o usuário tiver usado o sudo recentemente). No entanto, para um comportamento adequado, o script deve impedir que um usuário o execute como 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
Aqui, como a variável $USER corresponde ao usuário normal, ela seria inserida como argumento esperado para gpasswd.
Este exemplo seria executado como um usuário normal; não sudo. Observe, entretanto, que o usuário deve ter privilégios sudo para que ele seja executado corretamente.