Gibt es eine Möglichkeit, su
bei einem falschen Passwort erneut nach dem Passwort zu fragen (so wie sudo
es 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 foo
auch 1 zurück, wodurch es unmöglich wird, festzustellen, ob ein falsches Kennwort eingegeben wurde oder ein foo
Fehler 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 foo
ein anderer Exit-Code vorhanden ist.
WARNUNG:Wenn Sie diesen Workaround verwenden (der etwas hässlich ist), können Sie foo
den Exit-Code von nicht ermitteln. Ich weiß nicht, ob er für Ihr Projekt erforderlich ist.
Antwort2
su
gibt 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