Заставить 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

Связанный контент