
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_USER
variable para determinar si el script se está ejecutando.a través de sudo
y, 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 USER
en 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 docker
tu 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 newgrp
esta 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 funcionando
myscript.sh
newgrp
- el caparazón comenzó
docker
como grupo primario
- el caparazón comenzó
- el caparazón funcionando
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.