Hacer que solicite la contraseña varias veces

Hacer que solicite la contraseña varias veces

¿Hay alguna forma de suvolver a solicitar la contraseña en caso de una contraseña incorrecta (tal como sudolo hace)?

Inicialmente pensé en esto:

while ! su -c foo; do
  read -n 1 -p "Retry(y/n)?" ch
  if [[ "$ch" != "y" ]]; then
    break
  fi
done

Pero fooen algunos casos también devuelve 1, lo que hace imposible detectar si se ingresó una contraseña incorrecta o si foose produjo un error.

Respuesta1

Como solución alternativa, sugeriría lo siguiente:

#!/bin/bash
while ! su -c "foo; exit 0"; do
    read -n 1 -p "Retry? (y/n) " ch
    [[ "$ch" != "y" ]] && break   # This does the same in fewer lines
done

Esto devuelve un valor cero incluso si footiene un código de salida diferente.
ADVERTENCIA:Al utilizar esta solución alternativa (que es un poco fea), no podrá determinar fooel código de salida. No sé si es necesario para su proyecto.

Respuesta2

sudevuelve 1 en caso de error de autenticación, así que organice el comando para evitar este código de error. Por ejemplo, si no le importa combinar los valores de estado 126 y 127:

while
  su -c 'foo; ret=$?; if [ "$ret" -ge 1 ] && [ "$ret" -le 126 ]; the ret=$((ret+1)); fi'
  ret=$?
  [ ret -ne 1 ]
do
done
if [ "$ret" -ge 2 ] && [ "$ret" -le 126 ]; then ret=$((ret-1)); fi
echo "foo returned $ret" # or maybe 126 if this shows 127

información relacionada