Bash Scripting: requiere que el script se ejecute como root (o con sudo)


26

Estoy tratando de escribir un script bash (en Ubuntu) que respalde un directorio usando tar.

¿Cómo puedo hacer una verificación en el script para que solo se pueda ejecutar como root (o con sudo)?

Por ejemplo, si un usuario ejecuta el script, debe decir que este script debe ejecutarse con privilegios de sudo y luego salir. Si el script se ejecuta como root, continuará más allá de la comprobación.

Sé que tiene que haber una solución fácil, simplemente no he podido encontrarla buscando en Google.

Respuestas:


37

Para extraer el uid efectivo, use este comando:

id -u

Si el resultado es '0', el script se ejecuta como root o usa sudo. Puede ejecutar la verificación haciendo algo como:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

55
Recomendaría calificar completamente la ruta a id (por ejemplo, / usr / bin / id). De lo contrario, un usuario tortuoso podría escribir su propio script / binario que siempre devuelve 0 y luego colocarlo en una ubicación que exista anteriormente en la ruta de acceso de los usuarios en ejecución.
ktower el

Convenido. Arreglando con una edición.
Scott Pack

66
Cualquier persona 'desviada' que intente ejecutar el script no se detendrá si usa la ruta completa a id.
theotherrecibido el

Estoy de acuerdo con el otro ... es un script bash. Calificar el contenedor 'id' no detendrá a nadie que tenga la intención seria de evitar el cheque de todos modos. Es mejor dejarlo sin reservas para la portabilidad.
Chris

1
Esto no aborda el requisito de "sudo".
GregB

17

Supongo que sabes que al cambiar la propiedad a root

chown root:root file

y establecer los permisos a 700

chmod 700 file

logrará lo mismo, sin la sugerencia de ejecutar como sudo.

Pero publicaré esta respuesta para completar.


3
Esta es una solución más apropiada que la respuesta aceptada. - Mi $ 0.02
Chris

Nota al margen: verificar el script en git se vuelve más difícil. Para arreglar,sudo git add <file>
Chaim Eliyah

2

¿Cuál es su objetivo aquí, informar al usuario que debe ejecutar el script como root o como algún tipo de precaución de seguridad?

Si solo desea informar al usuario, cualquiera de las sugerencias de UID está bien, pero son tan útiles como los neumáticos en un caballo como precaución de seguridad: no hay nada que impida que un usuario copie el script, sacando la declaración if, y ejecutarlo de todos modos.

Si se trata de un problema de seguridad, el script debe establecerse en 700, propiedad de root: root, para que ningún otro usuario pueda leerlo o ejecutarlo.


O bien, podría ser el guión requiere el acceso a archivos o comandos sólo se puede acceder a la raíz con el fin de llevar a cabo su trabajo, como en mi caso
chrisbunney

2

Puedes usar el comando whoami también.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

En realidad, el uid 0 es la cuenta de usuario especial con privilegios completos. "root" es simplemente la etiqueta / nombre más común asignado a ese UID. No tiene que ser 'root' y un atacante puede intentar explotar esto.
0xSheepdog

2

La variable bash $EUIDmuestra el UID efectivo en el que se ejecuta el script, si desea asegurarse de que el script se ejecute como root, verifique si $EUIDcontiene el valor 0 o no:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

Esto es mejor que la solución con /usr/bin/id(¡para bash scripts!) Porque no requiere un comando externo.


1
En lugar de salir, podría solicitar al usuario que inicie sesión en sudo reemplazando la echolínea con sudo "$0" "$@"y reemplazando exit 2con exit $?.
schumacher574

Buena idea. Sin embargo, la pregunta pedía un script que se cerrara, no ejecutaba sudo por sí mismo.
neuhaus hace

0

Una manera simple de hacer que el script solo sea ejecutable por root es comenzar el script con la línea:
#!/bin/su root


-1

"#! / bin / su root" permite a los usuarios en modo superusuario ejecutar el script sin usar la contraseña de root. Si desea que los superusuarios ejecuten el script con resultados como root, esto lo hace.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.