Как проверить, был ли введен пароль sudo для этой терминальной сессии?


16

Как сказано в заголовке, мне нужно проверить, был ли введен пароль sudo для этого терминального сеанса в оболочке (иначе, если у меня есть права sudo сейчас).

Если у меня есть это, я хотел бы сделать одну вещь, и если у меня ее нет, то это не должно побуждать меня к этому, просто позвольте мне сделать другую вещь.

Так что в псевдокоде это выглядит так:

if (sudo = true)
   echo "i got sudo"
else
   echo "i dont have sudo"
fi

Но все команды, которые я нашел для этого, всегда запрашивают пароль sudo при попытке проверить.

Основная идея заключается в том, что скрипт может (и будет) запрашивать пароль sudo в нескольких местах, но я не хочу выводить на экран «Теперь скрипт запросит ваш пароль sudo». если он уже был введен (что означает, что он не будет запрашивать пароль sudo).

Надеюсь, кто-нибудь может мне помочь.

Ответы:


21

Ты можешь использовать:

if sudo -n true 2>/dev/null; then 
    echo "I got sudo"
else
    echo "I don't have sudo"
fi

Опция -n(неинтерактивная) не позволяет sudoпользователю запрашивать пароль. Если для выполнения команды требуется пароль, sudoотобразится сообщение об ошибке (перенаправлено на /dev/null) и завершено. Если пароль не требуется, то это выражение истинно: sudo -n true 2>/dev/null.


4
На самом деле не помогает выводить строку и сравнивать ее с другой строкой, для завершения теста достаточно кода выхода из sudo. Первая строка может бытьif sudo -n true 2>/dev/null; then
Стивен К

@ StevenKath Это делает то же самое, но спасибо за предложение. Я улучшил свой ответ, так как ваше предложение более элегантно.
Раду Рэдяну

2
Я знаю, что это AskUbuntu, но в MacOSX это не работает, sudo -n всегда возвращает 0, поэтому проверка кода возврата не удалась. Я говорю это здесь, потому что я искал это, и эта страница появляется в Google.
Нормализовать

1
Это плохая идея, поскольку она будет отправлять почту пользователю root каждый раз, когда потребуется пароль, если mail_badpassон включен в sudoers.
nyuszika7h
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.