Fazendo su pedir senha várias vezes

2

Existe alguma maneira de fazer com que su solicite a senha novamente no caso de uma senha errada (assim como sudo )?

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 retorna 1 em alguns casos, tornando impossível detectar se uma senha incorreta foi digitada ou se foo falhou.

    
por user2064000 20.06.2014 / 14:14

2 respostas

3

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

    
por 20.06.2014 / 14:29
1

su retorna 1 em uma falha de autenticação, portanto, providencie o comando para evitar esse código de erro. Por exemplo, se você não se importa em confundir 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
    
por 21.06.2014 / 10:36