Estoy escribiendo un script bash simple, pero lo necesito para verificar si se está ejecutando como root o no. Sé que probablemente haya una forma muy simple de hacerlo, pero no tengo idea de cómo.
Para que quede claro:
¿Cuál es una forma sencilla de escribir un guión foo.sh , para que el comando ./foo.shsalidas 0, y el comando de sudo ./foo.shsalidas 1?

$UIDy$EUIDson bashismos. Los shells que simplemente cumplen con POSIX no tienen esas variables y debes usarlosid(1)en su lugar.if ((EUID)); then, vea el comentario de @ geirhasudo. Si corressudo sh -c 'echo $EUID', verás los resultados esperados.$EUIDes un Bashismo (como se mencionó anteriormente por @DavidFoerster), y/bin/shes muy probable que sea un enlace a él/bin/dash, no/bin/bash.sudo bash -c 'echo $EUID'dará el resultado esperado.Un usuario root no tiene que llamarse "root".
whoamidevuelve el primer nombre de usuario con ID de usuario0.$USERcontiene el nombre del usuario conectado, que puede tener ID de usuario0, pero tener un nombre diferente.El único programa confiable para verificar si la cuenta ha iniciado sesión como root o no:
Lo uso
-upara la identificación de usuario efectiva , no-rpara la identificación de usuario real . Los permisos están determinados por la identificación de usuario efectiva , no por la real .Pruebas
/etc/passwdcontiene los siguientes nombres de usuario con ID de usuario0en el orden dado:Conectado como
root2, da los siguientes resultados:whoami:rootxecho $USER:root2(esto devuelve una cadena vacía si el programa se inició en un entorno vacío, por ejemploenv -i sh -c 'echo $USER')id -u:0Como puede ver, los otros programas fallaron en esta verificación, soloid -upasaron.El script actualizado se vería así:
fuente
id -uen bash askubuntu.com/questions/30148/…sh(dash) como intérprete en lugar debash. Pero buen tiro, salva otro tenedor :)[ -w / ]. La idea sigue siendo la misma. Nota: en ciertos chroots,[ -w /etc/shadow ]fallará porque/etc/shadowno existe, por lo tanto,/se prefiere el enfoque con . Una manera mejor sería verificar la necesidad real de permisos de root. Si el script necesita escribir/etc/someconfig, solo verifique si ese archivo es editable O el archivo no existe y/etces editable.Como dijo @Lekensteyn , debes usar una identificación de usuario efectiva. No necesitas llamar
id -ua bash:La sugerencia de @ geirha de los comentarios utiliza la evaluación aritmética:
fuente
((..))para probar números y[[..]]para probar cadenas y archivos, así que lo haría en suif (( EUID != 0 )); thenlugar, o simplementeif ((EUID)); thenEUIDdebería convertirse$EUID. En lugar de usar(( $EUID != 0 )), usa[ $EUID != 0 ]. Funcionarádashtambién con .EUIDfunciona bien. La pregunta es etiquetadobashnodash. El comandoenv -i sh -c '[ $EUID != 0 ]'falla, peroenv -i bash -c '(( EUID != 0 ))'funciona. por cierto,dashno funciona para algunos caracteres no ASCII en Ubuntu stackoverflow.com/questions/5160125/... Es 2011 y hay personas que usan otros idiomas.$EUIDcosas de aquí en adelante. Como resultado, he cambiado la respuesta aceptada.Puede lograr esto utilizando el
whoamicomando, que devuelve el usuario actual:La ejecución de lo anterior se imprimirá
You must be root to do this.si el usuario actual no lo estároot.Nota: una alternativa en algunos casos es simplemente verificar la
$USERvariable:fuente
$USER, especialmente de esta manera.$USERestá configurado por el shell de inicio de sesión, no necesariamente se propaga al programa (env -i sh -c 'echo $USER'). De esa manera,$USERestá vacío y se produce un error de sintaxis.$USERestablece el shell, sino que también es algo fácil de burlar. Whoami devolverá el usuario real.$USERes interpretado por su shell, su ejemplo debe sersudo sh -c 'echo $USER'para que tenga sentido. @George: hace una suposición equivocada quewhoamisiempre regresarárootpara UID 0.Teniendo en cuenta la eficiencia, puede probar, primero, la
EUIDvariable de entorno y luego, si no existe, llamar alidcomando estándar :De esta manera, debido al acceso directo OR , evita llamar a un comando del sistema, priorizando la consulta de una variable en memoria.
Reutilización de código:
fuente
id -u. Vea el script de banco junto con los resultados a continuación aquí: pastebin.com/srC3LWQyfuente
Una manera simple de hacer que el script solo sea ejecutable por root es comenzar el script con la línea:
#!/bin/su rootfuente
fuente
Este fragmento podría:
sudo !!if ["$ (whoami & 2> / dev / null)"! = "root"] && ["$ (id -un & 2> / dev / null)"! = "root"] entonces echo "¡Debes ser root para ejecutar este script!" echo "usa 'sudo !!'" salida 1 fifuente
Esta respuesta es solo para guardar una idea, puede ser útil para algunos de ustedes. Si necesita un script que se ejecuta desde la GUI del escritorio y requiere privilegios de root, intente de esta manera:
De esta manera, obtendrá una buena ventana de diálogo que le pedirá la contraseña de usuario root. Al igual que con la línea de comandos sudo.
Es
gksudoposible que no esté disponible en su sistema y luego instálelo consudo apt-get install gksu.fuente
Este código funciona tanto en Bash como en Bourne sh (probado en FreeBSD) que no define EUID. Si EUID existe, se devuelve su valor, de lo contrario se ejecuta el comando 'id'. Es un poco más corto que el ejemplo "o" anterior, ya que utiliza un shell incorporado ": -".
Raíz en sh:
fuente