Cómo comprobar si se está ejecutando como root en un script bash
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.
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/sh
en la parte superior y cámbialo a #!/bin/bash
.
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
.
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 root
nombre 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 $UID
la 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 sudo
mis 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 sudo
cuando lo ejecuta un usuario normal.
Si su script siempre va a ser ejecutado por root, simplemente configure los derechos correspondientes ( 0500
).
Mi frase:
if [ "$(id -u)" -ne 0 ]; then echo "Please run as root." >&2; exit 1; fi