Sudo - czy istnieje polecenie sprawdzające, czy mam sudo i / lub ile czasu mi zostało?


27

(Pierwotnie opublikowane na Stack Overflow. Sugerują, że spróbuję tutaj. Oto oryginalny post: /programming/3858208/sudo-is-there-a-command-to-check-if-i-have -sudo-i-lub-jak-ile czasu pozostało )

Zobacz tytuł. Chcę polecenia, które pozwoli mi na zapytanie sudo. Idealnie byłoby zwrócić sukces, jeśli nadal mam sudo, i fałsz, jeśli sudo wygasło. Przydałby się mi pozostały czas (chociaż gdybym się martwił, mógłbym po prostu zrobić sudo -v w celu rewalidacji). Och i nie powinienem prosić o hasło.

Najbliższą rzeczą, jaką znalazłem, jest „sudo -n prawda”, ale opcja -n jest obecna tylko na moim komputerze Centos 5 w pracy. -n kończy się niepowodzeniem, jeśli musi poprosić o hasło. Czy jest jakiś inny sposób na uzyskanie tej funkcjonalności? Załóżmy, że nie mam roota na wszystkich komputerach, z którymi pracuję, więc nie mogę instalować nowych wersji sudo według własnych upodobań.

Z tego powodu warto to zrobić, aby uzyskać monit o podanie statusu sudo. Lubię wiedzieć, które terminale są aktywne sudo. Mam również monit, który zmienia kolory, gdy jestem rootem, ale nie używam roota zbyt często, więc jest to ograniczone użycie.

Odpowiedzi:


10

-nOpcja jest dostępna w nowszych wersjach sudo, ale jak stwierdził, że nie jest to opcja. Nie ma prawdziwego sposobu na zrobienie tego, czego szukasz, po prostu wypróbowanie sudo i sprawdzenie, czy wróci z prośbą o podanie hasła. Jeśli martwisz się, że potrzebujesz wizualnego wskazania, dlaczego nie rozpocząć sudo / bin / bash, aby rozpocząć sesję root bash? Zauważ, że jest to niepewne, ale jest również nieco niepewne, jeśli ktoś zauważy twoje szybkie zmiany w sudo.


1
+1 za konsekwencje bezpieczeństwa wskaźnika wizualnego!
Wstrzymano do odwołania.

Ta część nie przyszła mi do głowy. Mam nadzieję, że ten wskaźnik przypomni mi o uruchomieniu sudo -K, zamiast zapomnieć o pozostawieniu sudo aktywnym i pozostawieniu otwartych potencjalnie niebezpiecznych terminali. Nie dlatego, że często zapominam zablokować ekran, ale podoba mi się dodatkowe ubezpieczenie.
valadil

W tej chwili skłaniam się do sprawdzenia sudo -V, a jeśli jest wystarczająco nowy, aby mieć -n, sprawdzam -n, aby otrzymać powiadomienie. Wygląda na to, że nigdzie nie powinno się niszczyć.
valadil

@valadil: Przyszło mi do głowy, że subtelny wskaźnik nie wprowadziłby zbyt dużego ryzyka bezpieczeństwa. Włącz na przykład podkreślenie nazwy użytkownika w wierszu polecenia.
Wstrzymano do odwołania.

@Dennis: Dokładnie. Nie zamierzałem zmieniać mojego monitu na „OMG_YOU_HAVE_SUDO_NOW! _User @ host” lub coś w tym rodzaju. Prawdopodobnie po prostu trochę zmienię kolor. Nie oczekuję, że ktokolwiek będzie wiedział, co to znaczy, chyba że usiądzie i zbliży się do mojego .bashrc.
valadil

29

Wiem, że to naprawdę stare pytanie, ale oto co zrobiłem dzisiaj w skrypcie:

CAN_I_RUN_SUDO = $ (sudo -n uptime 2> & 1 | grep "load" | wc -l)
jeśli [$ {CAN_I_RUN_SUDO} -gt 0]
następnie
    echo „Mogę uruchomić polecenie sudo”
jeszcze
    echo „Nie mogę uruchomić polecenia Sudo”
fi

1

Poniższe polecenie pokaże kolorowe oznaczenie przyznane przez sudo, więc pamiętaj, aby zrobić coś sudo -kprzed odejściem od maszyny. Przydaje się również na nie kolorowych terminalach.

Ponieważ możemy mieć sudo aktywne i nieaktywne na różnych sesjach terminalowych, stworzyłem to, co można umieścić na końcu ~ / .bashrc

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn=`if(($?==0));then echo true; else echo false; fi`

    history -a; # append to history at each command issued!!!
    local width=`tput cols`;
    local half=$((width/2))
    local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

Na typ terminala, bashaby go przetestować. Dodaje również cały wiersz za każdym razem, gdy wykonujesz polecenie, który zawiera informacje o czasie ostatniego polecenia, dzięki czemu możesz iść na lunch i wiedzieć, kiedy ostatnie polecenie się zakończyło :).

Możesz grać z tym kodem, aby dopasować go do swoich potrzeb. Jest też zmienna PS1 (to jest tak naprawdę mała pojedyncza linia), ale myślę, że lepiej nie zadzierać z nią.

PS .: dla OS-X, poszukaj komentarza poniżej @nwinkler.


Sprawdzanie kodu wyjścia sudo -nnie działa w systemie OS X. Zobacz moje pytanie tutaj: superuser.com/questions/902826/…
nwinkler

cóż, test, który proponuję, to sudo -nczy uważasz, że mógłby istnieć inny test, który mógłby zostać użyty do ustalenia, czy użytkownik ma aktywny dostęp do sudo? a może OS-X wymaga aktualizacji? Nigdy nie korzystałem z OS-X btw.
Wodnik Moc

2
Używam najnowszej wersji OS X. Możliwe, że sudo -nna BSD (na której oparty jest OS X) zachowuje się inaczej niż wersja GNU. Właśnie dodałem swój komentarz, aby poinformować ludzi, że ta wersja czeku wydaje się nie działać w systemie OS X. Użyłem czeku z innej odpowiedzi ( sudo -n uptime 2>&1|grep "load"|wc -l) i wydaje się, że działa dobrze w OS X. Nie jest tak elegancki, ale to działa.
nwinkler

1
@nwinkler oh, więc tak naprawdę zależy to od generowanej mocy wyjściowej (nie od wartości zwracanej), ciekawe obejście
Aquarius Power

@nwinkler, ale jest tak blisko, jak to możliwe. Lub nawet lepiej, ponieważ sudo -nstaje się buggy w sudo -V 1.7.9
Marco M. von Hagen

1

Aby uprościć odpowiedź udzieloną przez @ wags007

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

Jeśli jednak w Twojej https://www.sudo.ws/man/1.8.15/sudoers.man.html masz konfigurację, defaults mail_badpassza każdy test, który da wynik fałszywy (zostanie wyświetlony monit), zostanie wysłana wiadomość e-mail. Aby uniknąć takich uciążliwości, zmień tę część pliku sudoers na

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

W rezultacie wysyłane są e-maile z ostrzeżeniem dotyczącym bezpieczeństwa dla wszystkich poleceń oprócz / bin / true. Cóż, tak, ktoś może teraz spróbować brutalnie wymusić hasło, dzwoniąc sudo truenieograniczoną liczbę razy bez wysyłania wiadomości z ostrzeżeniem bezpieczeństwa.

Uwaga: Zawsze używaj visudozamiast ulubionego edytora do edycji pliku sudoers. W przeciwnym razie możesz zostać zablokowany.


0

Zgodnie z instrukcją sudo sesja sudo jest określana na podstawie pliku znacznika czasu ( /usr/lib/sudo/<username>), więc możesz dowiedzieć się, ile czasu pozostało, sprawdzając datę / godzinę pliku znacznika czasu. Jednak w moim systemie plik znacznika czasu jest w rzeczywistości katalogiem i są w nim trzy pliki z tajemniczą zawartością (oraz niektóre dziwne znaczniki czasu, ale /usr/lib/sudo/<username>wydaje się, że mają znacznik czasu, który pokrywa się z czasem, w którym podałem sudo moje hasło) Myślę, że /usr/lib/sudo/<username>/0ma znacznik czasu ostatniej sudoegzekucji.


1
W moim systemie pliki znaczników czasu znajdują się w katalogu, którego nie można odczytać bez użycia sudo, co monituje o hasło, a zatem nie działa na potrzeby OP.
Wstrzymano do odwołania.

Słuszna uwaga. Nie sprawdziłem własności tych plików. Masz rację, byłoby to bezużyteczne.
Dysaster,


0

Przynajmniej w sudo 1.8.21p2 to podejście działa dobrze:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi

0

Jest to prawdopodobnie skrajna nadwyżka w stosunku do standardu większości ludzi, ale tutaj jest (pozornie poprawna) funkcja, której używam do sprawdzania, czy sudojest odblokowana (funkcja nie marnuje czasu, jeśli uruchomi ją użytkownik root, ponieważ nie ma potrzeby odblokowywania sudo):

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo

-1

prosta odpowiedź ...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0

Spowoduje to monit o podanie hasła, jeśli użytkownik nie ma jeszcze aktywnej sesji sudo
Slizzered

-2

Co powiesz na stronę man

man sudo

Lista dostępnych poleceń:

sudo -l

samo sudo nie ma ograniczeń czasowych ani datowych ... patrz:

man sudo
man sudoers

sudo -l wyświetla monit o hasło. Potrzebuję powiedzieć, że nie mam aktywnej sesji sudo.
valadil

status sudo przekroczył limit czasu, ale masz rację, jeśli masz na myśli, że nie ma on funkcji harmonogramu.
Wstrzymano do odwołania.

Tak - limit czasu - ale brak harmonogramu.
Andreas Rehm,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.