Solicitar al usuario que inicie sesión como root cuando ejecuta un script de shell

17

El problema que tengo es que, cuando ingreso el comando,

su - root

al comienzo de mi archivo de script de shell, le pide al usuario que ingrese la contraseña y NO continúa con el resto del script de shell. Luego tengo que localizar y ejecutar manualmente el script de shell a través de la terminal. Quiero que el script se asegure de que el usuario inicie sesión como root y luego continúe con el resto del script de shell.

En otras palabras, quiero ejecutar el script como cualquier usuario, pero tan pronto como el script comience a ejecutarse, el usuario debe cambiar a root y luego continuar con el resto del script como root hasta que esté listo. Se puede hacer esto?

Redson
fuente

Respuestas:

34

Esto es muy fácil de lograr:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

Cuando el usuario actual no sea root, vuelva a ejecutar el script sudo.

Tenga en cuenta que estoy usando sudoaquí en lugar de su. Esto se debe a que le permite preservar los argumentos. Si lo usa su, su comando tendría que ser el su -c "$0 $@"que destrozaría sus argumentos si tienen espacios o caracteres especiales de shell.

Si su shell es bash, puede evitar la llamada externa a whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"
Patricio
fuente
Lo sentimos, cometí un error en la explicación, por lo que podría haber sido malinterpretado. Aquí hay una explicación más clara. ¡Gracias por la ayuda!
Redson
@ user68857 Su pregunta fue clara. Esta respuesta hace exactamente lo que quieres.
Patrick
sigo recibiendo este error: sudo: debe ser setuid root
Redson
Quiero ejecutar el script como un usuario normal a través de la terminal, pero el script debería cambiar al usuario a root hasta el final del script
Redson
@Nosscire si estás recibiendo sudo: must be setuid root, entonces algo le sucedió a tu sudo. Para solucionarlo: chmod u+s $(which sudo). Y sí, soy muy consciente de lo que intentas hacer, hago lo mismo todo el tiempo en mis guiones.
Patrick
7

También puede verificar el UID:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi
Arroyo
fuente
5

Puede llamar al script en sí y verificar:

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...
Hauke ​​Laging
fuente
0

En el punto donde desea iniciar sesión, simplemente agregue el siguiente comando

sudo su

Esto funciona perfectamente con mi código

usuario245333
fuente