Cómo crear un script que ejecute yum como root, pero el resto del script como usuario que llama

Cómo crear un script que ejecute yum como root, pero el resto del script como usuario que llama

Tengo un script bash que usa yum para instalar algunas utilidades relacionadas con Docker y, naturalmente, yum necesita acceso sudo. Entonces ejecuto el script a través de:

sudo ./myscript.sh

Pero el script termina cambiando mi usuario a root una vez hecho. Esto es un problema para mí, porque quiero que el final del script agregue al usuario que lo ejecuta al grupo de usuarios de Docker mediante:

groupadd docker
gpasswd -a $USER docker

Entonces, cuando finaliza el script, agrega root al grupo en lugar del usuario actual; imagino que esto se debe a que lo ejecuto con sudo.

¿Es posible sudo ejecutar un script pero conservar el inicio de sesión del usuario actual? Por lo que tengo entendido, generalmente no es una buena idea usar sudo dentro de los scripts.

Aquí está el guión (editado después de las respuestas a continuación):

#!/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"

Respuesta1

Puede verificar la SUDO_USERvariable para determinar si el script se está ejecutando.a través de sudoy, de ser así, qué usuario lo ejecutó. Entonces simplemente usarías eso en gpasswd:

gpasswd -a "${SUDO_USER}" docker

o

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

si desea recurrir a USERen ausencia de SUDO_USER.

El comando que hace que termines conectado como root(estrictamente hablando, esto no cambia tu inicio de sesión, ejecuta un nuevo shell) es

newgrp docker

Para arreglar eso,es decirterminas siendo tú mismo con dockertu grupo principal, necesitas ejecutarlo como tú mismo; asumiendo sudo,

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

hará esto.

Tenga en cuenta que finalizar su secuencia de comandos de newgrpesta manera significa que su secuencia de comandos no finaliza como tal cuando recibe un nuevo mensaje; el resultado es

  • El caparazón en el que estás cuando escribes.sudo ./myscript.sh
    • sudo
      • el caparazón funcionandomyscript.sh
        • newgrp
          • el caparazón comenzó dockercomo grupo primario

El script solo se cerrará cuando salga del shell iniciado por newgrp.

Respuesta2

Si el uso de sudo se considera generalmente una buena práctica, y si su uso, especialmente dentro de un script corto destinado a ser ejecutado manualmente, simplifica la lógica o el mantenimiento y logra el objetivo deseado, entonces yo diría que el uso de sudo dentro de un script es apropiado, si no preferible.

Es posible utilizar sudo dentro del script y ejecutarlo como un usuario normal. El sudo invocado normalmente solicitará una contraseña, solo una vez (o ninguna si el usuario ha usado sudo recientemente). Sin embargo, para un comportamiento adecuado, el script debería impedir que un usuario lo ejecute 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

Aquí, dado que la variable $USER corresponde al usuario normal, se insertaría como argumento esperado para gpasswd.

Este ejemplo se ejecutaría como un usuario normal; no sudo. Sin embargo, tenga en cuenta que el usuario debe tener privilegios sudo para que se ejecute correctamente.

información relacionada