Su mehrmals nach dem Passwort fragen lassen

Su mehrmals nach dem Passwort fragen lassen

Gibt es eine Möglichkeit, subei einem falschen Passwort erneut nach dem Passwort zu fragen (so wie sudoes das tut)?

Zuerst dachte ich an Folgendes:

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

Gibt in einigen Fällen jedoch fooauch 1 zurück, wodurch es unmöglich wird, festzustellen, ob ein falsches Kennwort eingegeben wurde oder ein fooFehler aufgetreten ist.

Antwort1

Als Workaround würde ich Folgendes vorschlagen:

#!/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

Dies gibt einen Nullwert zurück, auch wenn fooein anderer Exit-Code vorhanden ist.
WARNUNG:Wenn Sie diesen Workaround verwenden (der etwas hässlich ist), können Sie fooden Exit-Code von nicht ermitteln. Ich weiß nicht, ob er für Ihr Projekt erforderlich ist.

Antwort2

sugibt bei einem Authentifizierungsfehler 1 zurück, also stellen Sie sicher, dass der Befehl diesen Fehlercode vermeidet. Wenn Sie beispielsweise die Statuswerte 126 und 127 nicht verwechseln möchten:

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

verwandte Informationen