Como criar um script que execute yum como root, mas o restante do script como usuário chamador

Como criar um script que execute yum como root, mas o restante do script como usuário chamador

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_USERvariável para determinar se o script está sendo executadoatravés da sudoe, 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 USERna 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 dockercomo 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 newgrpdessa maneira significa que ele não termina assim quando você recebe um novo prompt; o resultado é

  • o shell em que você está quando digitasudo ./myscript.sh
    • sudo
      • o shell funcionandomyscript.sh
        • newgrp
          • o shell começou dockercomo o grupo primário

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.

informação relacionada