Existe alguma maneira de su
solicitar a senha novamente em caso de senha errada (assim como sudo
acontece)?
Inicialmente pensei nisso:
while ! su -c foo; do
read -n 1 -p "Retry(y/n)?" ch
if [[ "$ch" != "y" ]]; then
break
fi
done
Mas foo
também retorna 1 em alguns casos, tornando impossível detectar se uma senha errada foi inserida ou se foo
falhou.
Responder1
Como solução alternativa, sugiro o seguinte:
#!/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
Isso retorna um valor zero mesmo que foo
tenha um código de saída diferente.
AVISO:usando esta solução alternativa (que é um pouco feia), você não será capaz de determinar foo
o código de saída de. Não sei se é necessário para o seu projeto.
Responder2
su
retorna 1 em uma falha de autenticação, portanto, organize o comando para evitar esse código de erro. Por exemplo, se você não se importa em combinar os valores de status 126 e 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