Ejecute solo partes de un script como sudo, ingresando la contraseña solo una vez

14

Estoy escribiendo un script (en realidad, una combinación de scripts y makefile) que instala dependencias externas: algunos apt-getcomandos, algunos gitclonando, construyendo, instalando, agregando usuarios a grupos, ...

Algunas de las operaciones en estos scripts requieren permisos de superusuario, otras no.

Hasta ahora he ejecutado todo el proceso de creación con sudo, pero tiene algunos inconvenientes:

  • gitrepos clones obtengo rootcomo propietario, lo que significa que no puedo modificarlos después sin sudoochown
  • los scripts que agregan usuarios a grupos no saben qué usuario agregar ya que whoamidevuelveroot

¿Cuál es la mejor manera de ejecutar como superusuario solo los comandos que lo requieren? Idealmente, el proceso aún requeriría que ingrese mi sudocontraseña, pero solo una vez al comienzo del proceso de instalación. Luego lo olvidaría al final, pero manténgalo todo el tiempo hasta entonces (puede tomar varias horas).

Las soluciones que he encontrado en línea incluyen:

  • sudo -val comienzo del guión, pero si entiendo correctamente, esto agota el tiempo de espera. Mi script podría estar ejecutándose por un par de horas
  • ejecutando el script con sudo, pero los comandos que no necesitan superusuario con sudo -u $(logname) <command>. Esto es lo que hago ahora, pero parece que debería ser al revés.

Idealmente, me gustaría que mi guión:

  1. solicitar credenciales de superusuario
  2. ejecutar comandos normales como el usuario conectado
  3. ejecutar comandos sudo con las credenciales ingresadas en el paso 1
  4. sudo -k para cerrar la sesión de superusuario
Gauthier
fuente
2
Aún puede ejecutar todo como sudo, y su script puede verificar la SUDO_USERvariable de entorno. Si está presente, contendrá el nombre de usuario del usuario que invoca sudo. Por lo tanto, puede (como root) chown $ SUDO_USER: $ SUDO_GID $ your_files. Del mismo modo, puede verificar estas variables para que sus comandos adduser sepan qué usuario agregar.
roadmr
... o ejecuta todo como root y utiliza su $SUDO_USER -c commandlos comandos como usuario normal.
Rmano

Respuestas:

7

Como tiene acceso a sudo, cree un archivo de sudoers para usted, luego elimínelo cuando termine el script:

# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...

# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k
Glenn Jackman
fuente
2

Una forma, que generalmente no recomendaría, es leer la contraseña usted mismo y usar sudola -Sopción de pasar la contraseña cuando sea necesario:

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"

De man sudo:

 -S, --stdin
             Write the prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.
muru
fuente
1
¿Eso es seguro? echo "$password"??
αғsнιη
@KasiyA echo "$password"no lo sería, pero los documentos aquí y las herejías son un poco más seguros. No son visibles en la línea de comando que muestran las herramientas habituales.
muru
1
Creo que, estrictamente hablando, echo "$password"en el lado izquierdo de una tubería está seguro en un script bash. echoes una concha incorporada; /bin/echono se ejecuta cuando se llama simplemente echo .... Algunos otros proyectiles tienen un echobuiltin incorporado ( dashpor ejemplo), pero no se requiere que los proyectiles estilo Bourne tengan uno. Por lo tanto, creo que echo "$password" |es aceptable en bash, pero es mejor evitarlo en caso de que alguien transfiera el script a otro shell sin darse cuenta del problema. Yo uso un no portátil [[en lugar de [en esa secuencia de comandos para evitar el mismo tipo de problema. @KasiyA
Kagan