6

Я пишу сценарий, который был бы потенциально опасен, если его запустить неправильно. В качестве функции безопасности я хочу, чтобы скрипт требовал от пользователя повторного ввода своего пароля, как это делает sudo .

Так как мне это сделать? Другими словами, как мне

а) введите пароль, не повторяя его,

б) проверить пароль и

c) (для бонусных баллов) сделать это, не оставляя незашифрованный пароль в памяти, чтобы какой-нибудь умный парень выскребал из /proc или что-то в этом роде?

Это в bash но любой другой стандартный вариант оболочки Linux будет в порядке, если это проще.

2 ответа2

6

Пытаться:

su $USER -c true

А затем проверьте возвращаемое значение в $?. Например:

echo "Really delete everything? Enter your password to confirm:"
su $USER -c true && rm -rf $HOME

true там только как неоперация.

Для подавления вывода из su вы можете перенаправить stderr:

echo -n "Enter password for $USER:"
su $USER -c true 2>/dev/null  && echo -e "\nsuccess" || echo -e "\nfailure"

Вы не можете опустить параметр -c [command], так как это создаст новый интерактивный экземпляр bash (независимо от того, сгруппированы ли вы в подоболочки или нет):

$ ((su $USER ) && echo ok) ; echo "exit status:$?"
Password: 
$ echo $SHLVL 
2
$ exit
ok
exit status:0
$ echo $SHLVL 
1

Итак, пример в комментариях ниже:

((su $USER >/dev/null 2>&1) && echo ok) || echo no

ничего не отображалось (если только аутентификация su не удалась), потому что с правильным паролем вы теперь работаете во вложенной оболочке (со всеми перенаправленными выводами экрана). Нажмите CTRL-D (чтобы выйти из оболочки), и вы увидите "ок" эхом.

0

IMO, лучшая практика здесь - требовать прав администратора для запуска скрипта, изменяя права доступа к файлу / владельца. Таким образом, вы используете реализацию по умолчанию вместо того, чтобы заново изобретать колесо, создавая особую функцию проверки пароля (другими словами, вы требуете, чтобы пользователь либо вошел в систему как root, был в списке sudoers и использовал sudo либо использовал su чтобы стать root).

Щелкните правой кнопкой мыши на сценарии, выберите «Свойства», а затем на вкладке «Разрешения», чтобы изменить права доступа / владельца. Или используйте chmod / chown для этого (см. Справочные страницы для получения дополнительной информации). Сделай все это как root.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .