su にパスワードを複数回要求させる

su にパスワードを複数回要求させる

suパスワードが間違っている場合に、再度パスワードを要求する方法はありますか(そうでsudoあるように)?

最初、私はこう考えました:

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

しかし、foo場合によっては 1 を返すため、間違ったパスワードが入力されたか、foo失敗したかを検出できなくなります。

答え1

回避策として、次の方法をお勧めします。

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

foo終了コードが異なる場合でも、ゼロ値を返します。
警告:この回避策 (少し見苦しいですが) を使用すると、 の終了コードを特定できなくなりますfoo。プロジェクトに必要かどうかはわかりません。

答え2

su認証に失敗すると 1 が返されるので、このエラー コードを回避するようにコマンドを調整します。たとえば、ステータス値 126 と 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

関連情報