Есть ли способ сделать так, чтобы 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