¿Hay alguna forma de su
volver a solicitar la contraseña en caso de una contraseña incorrecta (tal como sudo
lo 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 foo
en algunos casos también devuelve 1, lo que hace imposible detectar si se ingresó una contraseña incorrecta o si foo
se 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 foo
tiene un código de salida diferente.
ADVERTENCIA:Al utilizar esta solución alternativa (que es un poco fea), no podrá determinar foo
el código de salida. No sé si es necesario para su proyecto.
Respuesta2
su
devuelve 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