Jak sprawdzić, czy mam dostęp do sudo?

104

Niedawno wpadłem z tego powodu.

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.

Czy istnieje sposób, aby sprawdzić, czy mam dostęp do sudo?

Bruce
źródło
Zapytaj administratora systemu?
mdpc
1
@mdpc: Czy jest jeszcze inny sposób?
Bruce
Nie wspomniałeś, czy możesz uzyskać dostęp do roota, czy nie.
mdpc
45
To musi być pierwszy przypadek, gdy ktoś śledzi „To zdarzenie zostanie zgłoszone” .
slhck

Odpowiedzi:

121

Uruchom sudo -v. Zwykle służy do przedłużenia limitu czasu hasła sudo, ale może być wykorzystany do ustalenia, czy masz jakieś sudouprawnienia.

$ sudo -v
Sorry, user [username] may not run sudo on [hostname].

Fragment strony podręcznika:

Jeśli podano opcję -v (sprawdzanie poprawności), sudo zaktualizuje znacznik czasu użytkownika, w razie potrzeby monitując o hasło użytkownika. Wydłuża to limit czasu sudo o kolejne 5 minut (lub jakikolwiek limit czasu ustawiony jest w sudoers), ale nie uruchamia polecenia.

Jeśli użytkownik może uruchamiać tylko określone polecenia, to polecenie będzie działać, wskazując, że możesz uruchomić coś z różnymi uprawnieniami. Chociaż wiadomość wygląda inaczej przy próbie wykonania polecenia, do którego nie wolno ci w tym przypadku (i żadna poczta nie jest wysyłana do roota ), nadal możesz mieć problemy, jeśli administratorzy przeczytają /var/log/secure.

$ sudo ls
[sudo] password for [username]: 
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].

Aby dowiedzieć się, co możesz uruchamiać z różnymi uprawnieniami, możesz użyć sudo -l. Pamiętaj, że to polecenie wymaga podania hasła.

Daniel Beck
źródło
2
Dzięki. sudo -v działa dla mnie. Strona podręcznika mówi, że mogę również uruchomić sudo -l, ale prosi o hasło. Dlaczego?
Bruce
2
@Bruce Zgaduję tutaj, ale w przeciwnym razie ktoś (lub program, który uruchomisz) może dowiedzieć się, jakie programy mogą być uruchomione (być może bez wprowadzania hasła) przez bieżącego użytkownika i spróbować złośliwie wykorzystać te informacje.
Daniel Beck
Jak myślisz, co to oznacza, kiedy otrzymam to z powrotem patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>:? Podałem hasło i nic nie otrzymałem o nieautoryzowanym dostępie. Wiem, że mam sudoz powodzeniem uruchamianie innych poleceń, ale ta unable to resolve hostwiadomość mnie niepokoi, że coś innego może być funky na hoście.
Patrick M
@PatrickM Wygląda na problem z sudoersplikiem. Tam możesz określić, na którym hoście użytkownik ma uprawnienia do uruchomienia określonego polecenia (jest to przydatne, gdy używasz tego samego sudoerspliku na wielu komputerach). Możliwe, że nie można rozwiązać nazwy hosta określonej w tym pliku. Spróbuj to sprawdzić hostna przykład za pomocą polecenia.
Ale
Nie działa dla mnie na RHEL 6, sudo -vdał „xx nie ma w pliku sudoers. Ten incydent zostanie zgłoszony”.
79E09796,
43

To jest bardzo proste. Uruchom sudo -l. Spowoduje to wyświetlenie wszystkich posiadanych uprawnień sudo.

Brad Dausses
źródło
1
Być może przegłosowano, ponieważ powtarza to, co powiedział Daniel Beck prawie dwa lata temu.
G-Man,
1
Lub wyjaśnia, co się stało, to w najlepszym
razie
2
@Jathanathan: gdybyś teraz napisał skrypt w Ubuntu rigt, sudo -lpoprosi o hasło, czy możesz sudo, czy nie. sudo -vpyta tylko czy możesz i "$(whoami)" != "root"nigdy nie zapytasz o nic w żadnym linuksie.
bksunday
@bksunday Masz rację. Testowałem teraz na czystym Debianie Jessy i potwierdziłem twoje wyniki. Mój poprzedni (teraz usunięty) komentarz był prawdopodobnie wynikiem testów na maszynie, na której miałem kilka sudouprawnień.
Jonathan Ben-Avraham
@ G-Man, ale ta prosta odpowiedź pomogła mi bardziej niż prawdopodobnie bardziej precyzyjną odpowiedź Daniela, gdzie to polecenie jest niestety niestety samym końcem ...
Betlista,
11

Oto wersja przyjazna dla skryptów:

timeout 2 sudo id && echo Access granted || echo Access denied

ponieważ nie utknie na wprowadzonym haśle, jeśli nie masz sudodostępu.

Możesz również ustawić go w zmiennej takiej jak:

timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"

Uwaga: w systemie macOS musisz zainstalować coreutils, np brew install coreutils.

kenorb
źródło
Jakieś alternatywy, jeśli timeoutdomyślnie nie są dostępne, np. W OS X?
Harry
1
Musisz zainstalować coreutilsnp brew install coreutils.
kenorb
2
To nie działa dla mnie w skrypcie. Z niewyjaśnionego powodu skrypt zawiesza się, dopóki go nie zabiję.
beruic
7

Tutaj odpowiedź Geralda Schade'a można jeszcze poprawić!

Posługiwać się

prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
  # exit code of sudo-command is 0
  echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
  echo "has_sudo__needs_pass"
else
  echo "no_sudo"
fi

Oto kompletny przykład użycia w skrypcie :

#!/usr/bin/env bash

is_root () {
    return $(id -u)
}

has_sudo() {
    local prompt

    prompt=$(sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
    echo "has_sudo__pass_set"
    elif echo $prompt | grep -q '^sudo:'; then
    echo "has_sudo__needs_pass"
    else
    echo "no_sudo"
    fi
}

elevate_cmd () {
    local cmd=$@

    HAS_SUDO=$(has_sudo)

    case "$HAS_SUDO" in
    has_sudo__pass_set)
        sudo $cmd
        ;;
    has_sudo__needs_pass)
        echo "Please supply sudo password for the following command: sudo $cmd"
        sudo $cmd
        ;;
    *)
        echo "Please supply root password for the following command: su -c \"$cmd\""
        su -c "$cmd"
        ;;
    esac
}

if is_root; then
    echo "Error: need to call this script as a normal user, not as root!"
    exit 1
fi


elevate_cmd which adduser
ajneu
źródło
2

Dla mnie „ sudo -v” i „ sudo -l” nie działały w skrypcie, ponieważ czasami były interaktywne (prosząc mnie o hasło, jak wspomniano powyżej). „ sudo -n -l” również nie działał, dał kod wyjścia „1”, chociaż mam uprawnienia sudo z powodu brakującego hasła. Ale rozszerzenie polecenia do:

A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor

był dla mnie udany dla scenariusza. To wyrażenie podaje, 0czy bieżący użytkownik może wywołać „sudo”, a 1jeśli nie.

Objaśnienie:
Dodatkowy parametr -ndo sudozapobiega interaktywność.
Dane wyjściowe $Apolecenia „ sudo -n -v 2>&1” mogą być:
- puste (w tym przypadku sudo może być wywoływane przez bieżącego użytkownika), lub:
- uwaga, że ​​bieżący użytkownik nie jest autoryzowany do sudo, lub:
- tekst pytania dla hasło (w tym przypadku użytkownik jest autoryzowany).
(„asswor” będzie pasować do angielskiego „hasła”, a także do niemieckiego „Passwort”).

Gerald Schade
źródło
2

mam niską rangę do głosowania i komentowania, ale chciałem głosować za odpowiedzią Geralda Schade'a, ponieważ znalazłem to jedyny sposób wcześniej i myślałem, że nikt inny nie wie - do teraz: D

btw moje rozwiązanie:

[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]

(od końca 2015 r. mwhahaaa)

użytkownik629901
źródło
1
Przeczytaj „Dlaczego potrzebuję 50 reputacji, aby móc komentować”, aby upewnić się, że możesz zacząć komentować.
Pimp Juice IT
1

„Sudo access” jest w smaku. Dwa podstawowe smaki: Najpierw Ty lub grupa, której jesteś członkiem, musisz skonfigurować dostęp do sudo w pliku / etc / sudoers.

Po drugie, musisz znać swoje hasło lub musisz ostatnio wykonać polecenie sudo. Niedawno upłynął limit czasu. (Ciekawostka: możesz wydłużyć czas w pliku sudoera.)

Często chcę przetestować drugi rodzaj dostępu w prologu skryptu, który będzie musiał wykonać kilka kroków. Kiedy to sprawdzenie się nie powiedzie, mogę poinformować użytkownika, że ​​musi włączyć drugi rodzaj dostępu przed uruchomieniem skryptu.

bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled

-S mówi sudo, aby przeczytało hasło ze standardowego wejścia. -P ustawia pusty monit. -K kasuje drugi raz dostęp.

Ponieważ wysyła stderr do / dev / null, sprawdzi również, czy użytkownik ma pierwszy typ dostępu sudo.

Ben Hyde
źródło
-4

Wykonaj następujące kroki, aby wyświetlić plik sudoers. Jeśli tam jesteś, masz sudo. Jeśli nie, możesz dodać siebie.

  1. su
  2. visudo
  3. Dół pliku, wprowadź your_username_here ALL=(ALL) ALL
  4. Hit ESCi wpisz:wq
  5. Rodzaj exit
  6. Ponownie uruchom potrzebne polecenie sudo
  7. Wpisz swoje hasło (nie hasło roota)
Kruug
źródło
11
OP „dostał w kłopoty” do biegania sudo, więc prawdopodobnie nie jest administrator systemu, ani nawet jednym z elitarnych administratorów systemu. Prawdopodobnie jest tylko użytkownikiem, który myślał, że mógł otrzymać pewne ograniczone uprawnienia. Co sprawia, że ​​podejrzewasz, że może odejść ? su
Scott,