¿Cuál es el propósito de "verdadero" en bash "if sudo true; luego"

20

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
Matt Parkins
fuente
2
Si va a rechazar la pregunta, ¿podría explicar qué puedo hacer para mejorarla? ¿No es este el sitio de desbordamiento correcto?
Matt Parkins
44
No estoy seguro de dónde provienen los votos negativos; ¿Está tratando de negar la declaración o anular la declaración? Dices que quieres deshacerte tanto del verdadero / eco como del "más", entonces, ¿cuál es tu objetivo final?
Jeff Schaller
1
@ ctrl-alt-delor siguiendo ese enlace parece que todo lo que necesito hacer es poner un signo de exclamación frente al sudo y luego puedo eliminar tanto el eco como lo demás, y ahora lo he probado, eso funciona, gracias.
Matt Parkins
2
De paso, probablemente debería redirigir el mensaje de error a la secuencia de error:echo "Aborting script" >&2
Toby Speight

Respuestas:

38

trueen bash no es una palabra clave, es un programa que sale instantáneamente con un código de salida exitoso. Del mismo modo, falsees 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;

true
echo $? # 0
false
echo $? #1

if sudo trueNo es equivalente a if sudo == true. if sudo trueestá ejecutando el trueprograma usando sudoy verificando el código de salida.

Por lo tanto:

if sudo false; thenestá ejecutando el programa falsecomo sudo. La devolución siempre será falsa.

if sudo true == falseejecutará el programa truecon los argumentos ==y falseusando sudo. Obviamente, esto no es lo que quieres.

if [!(sudo true)] es una sintaxis no válida

Lo que probablemente estás buscando es

if ! sudo true;
JShorthouse
fuente
12
Como una corrección ligeramente pedante a la primera oración: en bash , truey falseson "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 trueejecutará el programa independiente, no el bash incorporado.
IMSoP
31
PD: mis resúmenes favoritos de truey falseson los títulos en sus páginas de manual: true - do nothing, successfullyyfalse - do nothing, unsuccessfully
IMSoP
3
@IMSoP Eso es profundo.
Brainplot
2
Si trueno 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.
nigel222
2
En AT&T SYSV Unix, "verdadero" era un script de shell / bin / true, que consistía en un gran aviso de copyright en los comentarios ... y nada más.
Lee Daniel Crocker
21

¿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 trueprograma como se explica en la respuesta aceptada.

Mehrdad
fuente
1
Esencialmente, esto. La alternativa podría ser verificar si el usuario está en el grupo de sudoers, pero solo correr sudo truetambién es bastante fácil, aunque un poco hacky.
Sergiy Kolodyazhnyy
3
Tenga en cuenta que esto también requiere sudoser 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.)
Mehrdad
1
El OP quiere abandonar si no puedes sudo, y deshacerte de dos líneas en lugar de tener otro que siga a un noop.
mckenzm
2
Y, a la inversa, también puede hacerlo sudosin 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 incluso sudo trueno es infalible, ya que el sudoacceso se puede otorgar solo para comandos específicos, por lo que puede sudo true, pero no puede hacerlo sudo 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 ejecutar sudo.
Dave Sherohman
2
Además, puede estar en el sudoersgrupo y no poder hacerlo sudoporque el sudoersgrupo no figura en el sudoersarchivo. Un grupo con las cuatro letras sudoen su nombre no es una indicación válida de si un usuario en ese grupo puede hacer algo en particular o cualquier cosa usando sudo.
jrw32982 apoya a Monica el
5

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.

Luciano Andress Martini
fuente
1
Los únicos comandos que se ejecutan a través de sudo son sudo truey sudo -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.
ilkkachu
Escribí: "Entonces, en este caso, si necesitan ejecutar algún comando con sudo, primero verifica al inicio, solicitando la contraseña solo una vez"
Luciano Andress Martini