Estoy escribiendo un script que requiere permisos de nivel raíz, y quiero hacerlo de modo que si el script no se ejecuta como root, simplemente haga eco de "Ejecútelo como root". y salidas
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 (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 solo generaría un error. Esto solo está destinado a ejecutar de manera limpia un script que requiere comandos raíz, sin usar sudo dentro del script, solo estoy buscando algo de azúcar sintáctico.
id -u
devuelve0
para root.Respuestas:
La variable de entorno $ EUID contiene el UID del usuario actual. El UID de Root es 0. Use algo como esto en su script:
Nota: Si obtiene,
2: [: Illegal number:
verifique si tiene#!/bin/sh
en la parte superior y cámbielo a#!/bin/bash
.fuente
2: [: Illegal number:
advertencia hasta que lo cambié a la versión de Sergio.then
está en la misma línea que la condición ...En un script bash, tiene varias formas de verificar si el usuario en ejecución es root.
Como advertencia , no verifique si un usuario es root utilizando el
root
nombre de usuario. Nada garantiza que se llame al usuario con ID 0root
. 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 cuando se usa bash es usar
$EUID
, desde la página de manual:Esta es una mejor manera de lo
$UID
que podría cambiarse y no reflejar el usuario real que ejecuta el script.Una forma de abordar ese tipo de problema es inyectando
sudo
mis comandos cuando no se ejecuta como root. Aquí hay un ejemplo:De esta manera, mi comando es ejecutado por root cuando uso el superusuario o
sudo
cuando lo ejecuta un usuario normal.Si su script siempre debe ser ejecutado por root, simplemente configure los derechos en consecuencia (
0500
).fuente
printf $EUID
con o sin sudo, recupero mi propio UID. Si usoid -u
obtengo mi UID y cuando lo invoco con sudo obtengo 0 de regreso. ¿Hice algo mal?sudo bash <<<'echo $EUID'
abash <<<'echo $EUID'
. Más información sobre la herejía al estiloSe han dado algunas respuestas, pero parece que el mejor método es usar:
id -u
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
.fuente
o
:)
fuente
sudo
, simplemente puedo escribirsudo !!
y hace el trabajo por mí, en lugar de presionar la flecha ARRIBA, ir al comienzo de la línea y agregarsudo
a mano. No estoy seguro si eso es una cosa BASH o una cosa SUDO u otra, pero funciona la mayor parte del tiempo.if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fi
. Salud.Como @wrikken mencionó en sus comentarios,
id -u
es mucho mejor verificar la raíz.Además, con el uso adecuado de
sudo
, podría hacer que el script verifique y vea si se está ejecutando como root. Si no,sudo
haga que se recupere a través de y luego se ejecute con permisos de root.Dependiendo de lo que haga el script, otra opción puede ser configurar una
sudo
entrada para cualquier comando especializado que el script pueda necesitar.fuente
$0
tiene el nombre del script en ejecución. Hay algunos ejemplos aquí que podrían ayudarle.Hay una verificación simple para que un usuario sea root.
La
[[ stuff ]]
sintaxis es la forma estándar de ejecutar un check in bash.Esto también supone que desea salir con un 1 si falla. los
error
función es un toque que establece el texto de salida en rojo (no es necesario, pero es bastante elegante si me preguntas).fuente
error
comando? Mi sistema no parece tenerlo. . .less
o lo que sea); y (4) establecer un color de fondo, de modo que el texto sea legible independientemente del color de fondo del terminal del usuario. Entonces, algo asífunction error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }
. (Ajustar como se desee)De manera muy simple, solo pon:
El beneficio de usar esto en lugar de
id
es que puede verificar si cierto usuario no root también está ejecutando el comando; p.ej.fuente
whoami
lugar de usarid
; elwhoami
comando también se puede usar para buscar otros usuarios que no sean root, por nombre.0- Lea la documentación oficial de GNU Linux, hay muchas maneras de hacerlo correctamente.
1- asegúrese de poner la firma del shell para evitar errores de interpretación:
2- este es mi guión
fuente
En esta respuesta, que quede claro, supongo que el lector puede leer
bash
y ejecutar scripts de shell POSIX comodash
.Creo que no hay mucho que explicar aquí ya que las respuestas altamente votadas hacen un buen trabajo al explicar gran parte de ello.
Sin embargo, si hay algo más que explicar, no dude en comentar, haré todo lo posible para llenar los vacíos.
Solución integral optimizada (no solo ) para rendimiento y confiabilidad; todos los depósitos compatiblesbash
Nueva solución:
Benchmark (guardar en archivo
is_user_root__benchmark
)Solución original:
^^^ Se demostró que la solución eliminada no acelera las cosas, pero ha existido durante mucho tiempo, así que la mantendré aquí todo el tiempo que considere necesario.
Explicación
Dado que es muchísimo más rápido leer la variable
$EUID
estándarbash
, el número de identificación de usuario efectivo, que ejecutar elid -u
comando para encontrar la ID de usuario POSIX , esta solución combina ambos en una función muy bien empaquetada. Si, y solo si,$EUID
por alguna razón no está disponible, elid -u
comando se ejecutará, asegurando que obtengamos el valor de retorno adecuado sin importar las circunstancias .¿Por qué publico esta solución después de tantos años?
Bueno, si veo correctamente, parece que falta un fragmento de código arriba.
Verá, hay muchas variables que deben tenerse en cuenta, y una de ellas es combinar rendimiento y confiabilidad .
Solución POSIX portátil + Ejemplo de uso de la función anterior
Conclusión
Por mucho que posiblemente no te guste, el entorno Unix / Linux se ha diversificado mucho. Lo que significa que hay personas a las que les gusta
bash
tanto, que ni siquiera piensan en la portabilidad ( shells POSIX ). Otros como yo prefieren los proyectiles POSIX . Hoy en día es una cuestión de elección personal y necesidades.fuente
Si el script realmente requiere acceso de root, entonces sus permisos de archivo deberían reflejar eso. Tener una secuencia de comandos raíz ejecutable por usuarios no root sería una señal de alerta. Le animo a que no controle el acceso con un
if
cheque.fuente
777
bomba hace que esta verificación sea un poco defectuosa para el tipo de usuarios que cometerían el error en primer lugar.bash /path/to/script
, aún puede ejecutarse aunqueo=r
Una manera simple de hacer que el script solo sea ejecutable por root es comenzar el script con la línea:
#!/bin/su root
fuente
exit
? ¿Y todavía se están votando esas respuestas? Supongo que la gente implícitamente no quiere que el script se ejecute como root. Así que sigo esa forma de pensar, con una respuesta más simple. Pero sí, también puedes aprender de las respuestas más detalladas anterioresprueba el siguiente código:
O
fuente
Hasta donde sé, la forma correcta de verificarlo es:
Consulte la sección "Prueba de raíz" aquí:
http://linuxcommand.org/lc3_wss0080.php
fuente
= "0"
con-eq 0
id -u
es mucho mejor quewhoami
, ya que algunos sistemas como Android pueden no proporcionar la raíz de la palabra.Ejemplo:
fuente
Compruebe si es root y salga si no lo es:
O en este ejemplo, intente crear un directorio en la ubicación raíz e intente después de que se hayan elevado los derechos.
Compruebe si es root y, si no es así, eleve si es posible:
fuente
Nota del editor: si no necesita corchetes dobles, use uno solo para la portabilidad del código.
fuente
Verifique la raíz:
Probado y ejecutándose en root.
fuente