2013-02-18 19:36:35 +0000 2013-02-18 19:36:35 +0000
108
108

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

Ostatnio miałem z tego powodu problemy.

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

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

Odpowiedzi (9)

123
123
123
2013-02-18 19:51:06 +0000

Run sudo -v. Zazwyczaj jest on używany do wydłużenia limitu czasu hasła sudo, ale może być użyty do określenia, czy masz jakieś uprawnienia sudo.

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

Fragment strony Man:

Jeśli podano opcję -v (sprawdź poprawność), sudo zaktualizuje znacznik czasu użytkownika, w razie potrzeby pytając o hasło użytkownika. Przedłuża to czas działania sudo o kolejne 5 minut (lub cokolwiek innego jest ustawione w sudoers), ale nie uruchamia polecenia.

Jeśli użytkownik może wykonywać tylko polecenia specific, polecenie to będzie działać, wskazując, że użytkownik może wykonywać something z różnymi uprawnieniami. Podczas gdy wiadomość wygląda inaczej, gdy próbujesz wykonać komendę, której nie możesz w tym przypadku wykonać (i żadna poczta nie jest wysyłana do roota ), wciąż możesz mieć kłopoty 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 uruchomić z różnymi uprawnieniami, możesz użyć sudo -l. Zauważ, że to polecenie wymaga podania hasła.

43
43
43
2014-12-17 22:55:06 +0000

To bardzo proste. Run sudo -l. To będzie lista wszystkich przywilejów sudo, które masz.

12
12
12
2016-06-14 00:49:56 +0000

Oto wersja przyjazna skryptowi:

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

, ponieważ nie utknie na wpisanym haśle, jeśli nie masz dostępu do sudo.

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

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

Uwaga: Na macOSie musisz zainstalować coreutils, np.

9
9
9
2017-12-30 18:57:38 +0000

Odpowiedź Geralda Schade'a tutaj , można jeszcze poprawić!

Użyj

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 pełny 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
3
3
3
2017-02-28 02:27:06 +0000

Dla mnie, ‘sudo -v’ i ‘sudo -l’ nie działały w skrypcie, ponieważ czasami były interaktywne (pytając mnie o hasło, jak wspomniano powyżej). Również ‘sudo -n -l’ nie działało, dawało kod wyjścia ‘1’, chociaż mam uprawnienia sudo, z powodu brakującego hasła. Ale rozszerzenie komendy na:

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

było dla mnie udane dla skryptu. Wyrażenie to daje 0 jeśli aktualny użytkownik może wywołać ‘sudo’ i 1 jeśli nie.

Wyjaśnienie: Dodatkowy parametr -n do sudo uniemożliwia interaktywność.
Wyjście $A polecenia ‘sudo -n -v 2>&1’ może być: - puste (w tym przypadku sudo może być wywołane przez aktualnego użytkownika), lub: - uwaga, że aktualny użytkownik nie jest upoważniony do korzystania z sudo, lub: - tekst zapytania o hasło (w tym przypadku użytkownik jest upoważniony). (“asswor” będzie pasował do angielskiego “password”, jak również do niemieckiego “Passwort”).

2
2
2
2017-10-01 22:31:29 +0000

Mam niską rangę do zagłosowania i skomentowania, ale chciałem zagłosować za odpowiedzią Geralda Schade'a, ponieważ wcześniej stwierdziłem, że to jedyna droga i pomyślałem, że no1 jeszcze o tym nie wie - do teraz :D

btw my solution:

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

(od końca 2015 r. mwhaaa)

1
1
1
2020-02-11 09:15:13 +0000

To powinno wystarczyć, aby powiedzieć, czy masz roota czy nie:

sudo whoami

Jeśli sudo pyta o hasło roota, lub nie działa, oznacza to również, że nie masz uprawnień roota (przynajmniej nie przez sudo).

1
1
1
2016-08-30 17:58:05 +0000

“Sudo access” jest w smakach. Dwa podstawowe smaki: Po pierwsze ty, lub grupa, której jesteś członkiem, musisz być ustawiony na dostęp sudo w pliku /etc/sudoers.

Po drugie musisz znać swoje hasło, lub musisz wykonać polecenie sudo ostatnio. Ostatnio na tyle, że nie upłynął jeszcze limit czasu. (Fun fact: you can make the timeout very long in your sudoer’s file.)

I often want to test for the second kind of access in the prolog of a script that will need to sudo some steps. Kiedy to sprawdzenie nie powiedzie się, 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

The -S mówi sudo, aby przeczytał hasło z stdin. Skrypt -p ustawia pusty znak zachęty. -K czyści drugi rodzaj dostępu.

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

-5
-5
-5
2013-02-18 19:41:36 +0000

Wykonaj te kroki, aby wyświetlić plik sudoers. Jeśli tam jesteś, to masz sudo. Jeśli nie, możesz dodać siebie.

  1. su
  2. visudo
  3. W dolnej części pliku wpisz your_username_here ALL=(ALL) ALL
  4. Naciśnij ESC i wpisz :wq
  5. Wpisz exit
  6. Uruchom ponownie komendę, która była potrzebna sudo
  7. Wpisz swoje hasło (nie hasło roota)