Jak sprawdzić, czy hasło sudo zostało wprowadzone dla tej sesji terminala?

16

Jak powiedziano w nagłówku, muszę sprawdzić, czy hasło sudo zostało wprowadzone dla tej sesji terminala w powłoce (czyli jeśli mam teraz uprawnienia sudo).

Jeśli to mam, chciałbym zrobić jedną rzecz, a jeśli jej nie mam, to nie powinno mnie o to prosić, pozwól mi zrobić coś innego.

W pseudo-kodzie wygląda to tak:

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

Ale wszystkie polecenia, które znalazłem, zawsze monitują mnie o hasło sudo podczas próby sprawdzenia.

Podstawową ideą jest to, że skrypt może (i będzie) prosić o hasło sudo w kilku miejscach, ale nie chcę drukować „Skrypt poprosi teraz o hasło sudo”. jeśli zostało już wprowadzone (co oznacza, że ​​nie poprosi o hasło sudo).

Mam nadzieję, że ktoś może mi pomóc.

Moonbloom
źródło

Odpowiedzi:

21

Możesz użyć:

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

Opcja -n(nieinteraktywna) zapobiega sudopytaniu użytkownika o hasło. Jeśli do uruchomienia polecenia wymagane jest hasło, sudowyświetli się komunikat o błędzie (przekierowanie do /dev/null) i wyjście. Jeśli nie jest wymagane hasło, to wyrażenie jest prawdą sudo -n true 2>/dev/null.

Radu Rădeanu
źródło
4
Naprawdę nie pomaga echo ciągu i porównać go z innym ciągiem, kod wyjścia z sudo jest wystarczający do testu. Pierwsza linia może byćif sudo -n true 2>/dev/null; then
Steven K.
@StevenKath Robi to samo, ale dziękuje za sugestie. Poprawiłem odpowiedź, ponieważ twoja sugestia jest bardziej elegancka.
Radu Rădeanu
2
Wiem, że to jest AskUbuntu, ale to nie działa w MacOSX, sudo -n zawsze zwraca 0, więc sprawdzenie kodu powrotu kończy się niepowodzeniem. Mówię to tutaj, ponieważ szukałem tego, a ta strona pojawia się w Google.
Normadize
1
To zły pomysł, ponieważ wysyła pocztę do roota za każdym razem, gdy hasło będzie wymagane, jeśli mail_badpassjest włączone w sudoers.
nyuszika7h