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?
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?
Odpowiedzi:
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ś sudo
uprawnienia.
$ 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.
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 sudo
z powodzeniem uruchamianie innych poleceń, ale ta unable to resolve host
wiadomość mnie niepokoi, że coś innego może być funky na hoście.
sudoers
plikiem. 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 sudoers
pliku na wielu komputerach). Możliwe, że nie można rozwiązać nazwy hosta określonej w tym pliku. Spróbuj to sprawdzić host
na przykład za pomocą polecenia.
sudo -v
dał „xx nie ma w pliku sudoers. Ten incydent zostanie zgłoszony”.
To jest bardzo proste. Uruchom sudo -l
. Spowoduje to wyświetlenie wszystkich posiadanych uprawnień sudo.
sudo -l
poprosi o hasło, czy możesz sudo, czy nie. sudo -v
pyta tylko czy możesz i "$(whoami)" != "root"
nigdy nie zapytasz o nic w żadnym linuksie.
sudo
uprawnień.
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 sudo
dostę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
.
timeout
domyślnie nie są dostępne, np. W OS X?
coreutils
np brew install coreutils
.
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
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, 0
czy bieżący użytkownik może wywołać „sudo”, a 1
jeśli nie.
Objaśnienie:
Dodatkowy parametr -n
do sudo
zapobiega interaktywność.
Dane wyjściowe $A
polecenia „ 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”).
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)
„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.
Wykonaj następujące kroki, aby wyświetlić plik sudoers. Jeśli tam jesteś, masz sudo. Jeśli nie, możesz dodać siebie.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
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