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.sh
salidas 0
, y el comando de sudo ./foo.sh
salidas 1
?
$UID
y$EUID
son 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.$EUID
es un Bashismo (como se mencionó anteriormente por @DavidFoerster), y/bin/sh
es 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".
whoami
devuelve el primer nombre de usuario con ID de usuario0
.$USER
contiene 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
-u
para la identificación de usuario efectiva , no-r
para la identificación de usuario real . Los permisos están determinados por la identificación de usuario efectiva , no por la real .Pruebas
/etc/passwd
contiene los siguientes nombres de usuario con ID de usuario0
en el orden dado:Conectado como
root2
, da los siguientes resultados:whoami
:rootx
echo $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
:0
Como puede ver, los otros programas fallaron en esta verificación, soloid -u
pasaron.El script actualizado se vería así:
fuente
id -u
en 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/shadow
no 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/etc
es editable.Como dijo @Lekensteyn , debes usar una identificación de usuario efectiva. No necesitas llamar
id -u
a 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 )); then
lugar, o simplementeif ((EUID)); then
EUID
debería convertirse$EUID
. En lugar de usar(( $EUID != 0 ))
, usa[ $EUID != 0 ]
. Funcionarádash
también con .EUID
funciona bien. La pregunta es etiquetadobash
nodash
. El comandoenv -i sh -c '[ $EUID != 0 ]'
falla, peroenv -i bash -c '(( EUID != 0 ))'
funciona. por cierto,dash
no funciona para algunos caracteres no ASCII en Ubuntu stackoverflow.com/questions/5160125/... Es 2011 y hay personas que usan otros idiomas.$EUID
cosas de aquí en adelante. Como resultado, he cambiado la respuesta aceptada.Puede lograr esto utilizando el
whoami
comando, 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
$USER
variable:fuente
$USER
, especialmente de esta manera.$USER
está configurado por el shell de inicio de sesión, no necesariamente se propaga al programa (env -i sh -c 'echo $USER'
). De esa manera,$USER
está vacío y se produce un error de sintaxis.$USER
establece el shell, sino que también es algo fácil de burlar. Whoami devolverá el usuario real.$USER
es interpretado por su shell, su ejemplo debe sersudo sh -c 'echo $USER'
para que tenga sentido. @George: hace una suposición equivocada quewhoami
siempre regresarároot
para UID 0.Teniendo en cuenta la eficiencia, puede probar, primero, la
EUID
variable de entorno y luego, si no existe, llamar alid
comando 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 root
fuente
fuente
Este fragmento podría:
sudo !!
fuente
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
gksudo
posible 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