Cómo comprobar si se está ejecutando como root en un script bash

Resuelto Nathan asked hace 11 años • 24 respuestas

Estoy escribiendo un script que requiere permisos de nivel raíz y quiero que, si el script no se ejecuta como root, simplemente diga "Ejecútelo como root". y sale.

Aquí hay un pseudocódigo para lo que estoy buscando:

if (whoami != root)
  then echo "Please run as root"

  else (do stuff)
fi

exit

¿Cómo podría lograr esto mejor (de forma limpia y segura)? ¡Gracias!

Ah, solo para aclarar: la parte (hacer cosas) implicaría ejecutar comandos que en sí mismos requieren root. Por lo tanto, ejecutarlo como un usuario normal generaría un error. Esto solo está destinado a ejecutar limpiamente un script que requiere comandos raíz, sin usar sudo dentro del script, solo estoy buscando algo de azúcar sintáctico.

Nathan avatar Aug 14 '13 00:08 Nathan
Aceptado

La variable de entorno $EUID contiene el UID del usuario actual. El UID de Root es 0. Utilice algo como esto en su script:

if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi

Nota: Si te sale 2: [: Illegal number:comprueba si lo tienes #!/bin/shen la parte superior y cámbialo a #!/bin/bash.

ptierno avatar Aug 13 '2013 18:08 ptierno

Se han dado algunas respuestas, pero parece que el mejor método a utilizar es:

  • id -u
  • Si se ejecuta como root, devolverá una identificación de 0.

Esto parece ser más confiable que los otros métodos y parece que devuelve una identificación de 0 incluso si se ejecuta el script sudo.

Nathan avatar Feb 27 '2015 23:02 Nathan

En un script bash, tiene varias formas de verificar si el usuario que ejecuta es root.

Como advertencia , no verifique si un usuario es root usando el rootnombre de usuario. Nada garantiza que se llame al usuario con ID 0 root. Es una convención muy fuerte que se sigue ampliamente, pero cualquiera podría cambiar el nombre del superusuario por otro nombre.

Creo que la mejor manera de usar bash es usar $EUID, desde la página de manual:

EUID   Expands to the effective user ID of the current  user,  initialized
       at shell startup.  This variable is readonly.

Esta es una forma mejor que $UIDla que podría cambiarse y no reflejar al usuario real que ejecuta el script.

if (( $EUID != 0 )); then
    echo "Please run as root"
    exit
fi

Una forma de abordar ese tipo de problema es inyectando sudomis comandos cuando no los ejecuto como root. Aquí hay un ejemplo:

SUDO=''
if (( $EUID != 0 )); then
    SUDO='sudo'
fi
$SUDO a_command

De esta manera, mi comando se ejecuta mediante root cuando uso el superusuario o sudocuando lo ejecuta un usuario normal.

Si su script siempre va a ser ejecutado por root, simplemente configure los derechos correspondientes ( 0500).

sberder avatar Feb 07 '2014 08:02 sberder

Mi frase:

if [ "$(id -u)" -ne 0 ]; then echo "Please run as root." >&2; exit 1; fi
Dale_Reagan avatar Jan 27 '2014 03:01 Dale_Reagan