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

2

Eu tenho um script bash que usa o yum para instalar alguns utilitários relacionados ao Docker e, naturalmente, você precisa do acesso sudo. Então eu corro o script via:

sudo ./myscript.sh

Mas o script acaba mudando meu usuário para root depois que ele é feito. Este é um problema para mim, porque eu quero o fim do script para adicionar o usuário executando-o para o grupo de usuários Docker via:

groupadd docker
gpasswd -a $USER docker

Então, quando o script termina, ele adiciona root ao grupo em vez do usuário atual - imagino que isso ocorra porque eu o executo com o sudo.

É possível sudo executar um script, mas manter o login do usuário atual? Pelo que entendi, geralmente não é uma boa idéia usar o sudo nos scripts.

Aqui está o script (editado depois das 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"
    
por Patremagne 01.06.2017 / 22:56

2 respostas

2

Você pode verificar a variável SUDO_USER para determinar se o script está sendo executado via sudo e, em caso afirmativo, qual usuário o executou. Então você só usaria isso em gpasswd :

gpasswd -a "${SUDO_USER}" docker

ou

gpasswd -a "${SUDO_USER-$USER}" docker

se você quiser voltar para USER na ausência de SUDO_USER .

O comando que faz com que você acabe logado como root (estritamente falando, isso não altera seu login, ele executa um novo shell) é

newgrp docker

Para corrigir isso, ou seja, acaba sendo você mesmo com docker como seu grupo principal, você precisa executar isso como você mesmo; assumindo sudo ,

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

fará isso.

Observe que terminar seu script com newgrp significa que seu script não termina assim quando você recebe um novo prompt. o resultado é

  • o shell em que você está quando digita sudo ./myscript.sh
    • %código%
      • o shell executando sudo
        • %código%
          • o shell começou com myscript.sh como o grupo principal

O script só sairá quando você sair do shell iniciado por newgrp .

    
por 01.06.2017 / 23:00
2

Se o uso do sudo é 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 manutenção e alcança o objetivo desejado, então eu diria uso do sudo dentro de um script é apropriado, se não preferível.

É possível usar o sudo dentro do script e executar o script como um usuário normal. O sudo invocado normalmente pedirá uma senha, apenas uma vez (ou não, 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 o argumento esperado para o gpasswd.

Este exemplo seria executado como um usuário normal; não sudo. Note, no entanto, que o usuário deve ter privilégios sudo para que ele seja executado corretamente.

    
por 02.06.2017 / 00:30

Tags