Fazendo su pedir senha várias vezes

Fazendo su pedir senha várias vezes

Existe alguma maneira de susolicitar a senha novamente em caso de senha errada (assim como sudoacontece)?

Inicialmente pensei nisso:

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

Mas footambém retorna 1 em alguns casos, tornando impossível detectar se uma senha errada foi inserida ou se foofalhou.

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 footenha um código de saída diferente.
AVISO:usando esta solução alternativa (que é um pouco feia), você não será capaz de determinar fooo código de saída de. Não sei se é necessário para o seu projeto.

Responder2

suretorna 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

informação relacionada