He pirateado este script bash que prueba si el usuario tiene privilegios de superusuario y si no los tiene, los solicita. En última instancia, estoy tratando de invertir la segunda instrucción 'if' para poder eliminar las siguientes dos líneas (el eco "contraseña ok" y el otro en la siguiente línea)
# Root user only
if [[ "$EUID" != 0 ]]; then
sudo -k # make sure to ask for password on next sudo
if sudo true; then
echo "Password ok"
else
echo "Aborting script"
exit 1
fi
fi
echo "do my ops"
¿El propósito de "verdadero" en la cuarta línea es solo una declaración nula?
Necesito invertir la prueba en la cuarta línea, ¿cómo lo hago? Esto es lo que he intentado:
if sudo false; then
if sudo true == false; then
if [!(sudo true)]; then
echo "Aborting script" >&2
Respuestas:
true
en bash no es una palabra clave, es un programa que sale instantáneamente con un código de salida exitoso. Del mismo modo,false
es un programa que sale con un código de salida fallido.Puede probar esto ejecutando ambos programas desde su terminal y luego leyendo la
$?
variable, que contiene el código de salida del último programa;if sudo true
No es equivalente aif sudo == true
.if sudo true
está ejecutando eltrue
programa usandosudo
y verificando el código de salida.Por lo tanto:
if sudo false; then
está ejecutando el programafalse
como sudo. La devolución siempre será falsa.if sudo true == false
ejecutará el programatrue
con los argumentos==
yfalse
usandosudo
. Obviamente, esto no es lo que quieres.if [!(sudo true)]
es una sintaxis no válidaLo que probablemente estás buscando es
fuente
true
yfalse
son "incorporados", comandos interpretados directamente por el shell; en sistemas similares a Unix en general , también existen como programas independientes en el sistema de archivos. La diferencia no importa mucho aquí, pero que yo sepa,sudo true
ejecutará el programa independiente, no el bash incorporado.true
yfalse
son los títulos en sus páginas de manual:true - do nothing, successfully
yfalse - do nothing, unsuccessfully
true
no existiera, el código en la pregunta muestra por qué uno podría necesitar inventarlo. Es un programa mínimo que solo puede fallar si el sistema en el que se encuentra está realmente alterado. Por lo tanto, se puede usar para establecer si las credenciales de acceso están bien.¿Siento que la respuesta aceptada en realidad no respondió a tu pregunta?
El propósito de hacer esto es verificar que realmente puedas
sudo
.La forma en que se realiza esta verificación es a través del
true
programa como se explica en la respuesta aceptada.fuente
sudo true
también es bastante fácil, aunque un poco hacky.sudo
ser instalado, por lo que las comprobaciones no serían del todo equivalentes ... podría estar en el grupo de sudoers y aún así no podría sudo. (Esto puede surgir especialmente si, por ejemplo, está escribiendo un script para configurar una nueva imagen desde un tarball mínimo de rootfs, que podría no tener sudo.)sudo
sin estar en el grupo de sudoers si usted (ya sea personalmente o como miembro de algún otro grupo) está incluido en la lista/etc/sudoers
. Pero inclusosudo true
no es infalible, ya que elsudo
acceso se puede otorgar solo para comandos específicos, por lo que puedesudo true
, pero no puede hacerlosudo something_else
, o viceversa. No hay otra forma de probar con un revestimiento de hierro que no sea intentar ejecutar el comando con el que realmente desea ejecutarsudo
.sudoers
grupo y no poder hacerlosudo
porque elsudoers
grupo no figura en elsudoers
archivo. Un grupo con las cuatro letrassudo
en su nombre no es una indicación válida de si un usuario en ese grupo puede hacer algo en particular o cualquier cosa usandosudo
.Como veo en este guión. Solo está comprobando si sudo está habilitado, eso es todo ...
verdadero solo devuelve verdadero.
Entonces, en este caso, si necesitan ejecutar algún comando con sudo, primero verifica al inicio y solo les pide la contraseña una vez.
La condición funciona así: si sudo está ejecutando el comando verdadero correctamente, devolverá verdadero para la condición if, entonces sudo está habilitado y el usuario escribió la contraseña correctamente, de lo contrario, escribió la contraseña incorrectamente o sudo no está habilitado, el script No debe continuar.
Los otros comandos no necesitan solicitar la contraseña de sudo, porque su autenticación se realizó correctamente la primera vez (pero esto depende de la configuración de sudo, por lo que estos scripts dependen mucho de la configuración del entorno)
El 'echo password ok' lo demuestra también. el script de shell ya no pedirá la contraseña.
fuente
sudo true
ysudo -k
. Este último no requiere explícitamente una contraseña. Ninguno de los otros comandos en el script se ejecuta a través de sudo, por lo que, por supuesto, no requerirán contraseñas, independientemente de si la autenticación fue exitosa la primera vez.