Di recente mi sono messo nei guai per questo.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
C'è un modo per verificare se ho accesso sudo o no?
Di recente mi sono messo nei guai per questo.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
C'è un modo per verificare se ho accesso sudo o no?
Risposte:
Corri sudo -v
. Di solito viene utilizzato per estendere il timeout della password sudo, ma può essere utilizzato per determinare se si dispone di sudo
privilegi.
$ sudo -v
Sorry, user [username] may not run sudo on [hostname].
Estratto della pagina man:
Se viene data l'opzione -v (validate), sudo aggiorna il timestamp dell'utente, richiedendo la password dell'utente, se necessario. Questo prolunga il timeout di sudo per altri 5 minuti (o qualunque sia il timeout impostato su sudoers) ma non esegue un comando.
Se al tuo utente è consentito eseguire solo comandi specifici , questo comando funzionerà, indicando che ti è consentito eseguire qualcosa con privilegi diversi. Sebbene il messaggio appaia diverso quando si tenta di eseguire un comando non consentito in questo caso (e non viene inviata alcuna posta alla radice ), è comunque possibile che si verifichino problemi se gli amministratori leggono /var/log/secure
.
$ sudo ls
[sudo] password for [username]:
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].
Per scoprire cosa ti è permesso eseguire con diversi privilegi, puoi usare sudo -l
. Si noti che questo comando richiede l'inserimento della password.
patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>
:? Ho inserito la mia password e non ho ricevuto nulla di non autorizzato. So di dover sudo
eseguire correttamente altri comandi, ma quel unable to resolve host
messaggio mi preoccupa che qualcos'altro potrebbe essere strano sull'host.
sudoers
file. Qui puoi specificare su quale host un utente è autorizzato ad eseguire un comando specifico (questo è utile quando usa lo stesso sudoers
file su più macchine). Forse il nome host specificato in quel file non è stato risolto. Prova a controllarlo con il host
comando per esempio.
sudo -v
dato che "xx non è nel file sudoers. Questo incidente verrà segnalato."
Questo è molto semplice Corri sudo -l
. Questo elencherà tutti i privilegi di sudo che hai.
sudo -l
chiederà una password se puoi farlo o no. sudo -v
chiede solo se puoi, e "$(whoami)" != "root"
non chiederà mai nulla in nessun Linux.
sudo
priv.
Ecco la versione script-friendly:
timeout 2 sudo id && echo Access granted || echo Access denied
poiché non si bloccherà sull'inserimento della password se non si dispone sudo
dell'accesso.
Puoi anche impostarlo in una variabile come:
timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"
Nota: su macOS, è necessario installare coreutils
, ad es brew install coreutils
.
timeout
non è disponibile per impostazione predefinita, ad esempio su OS X?
coreutils
, ad es brew install coreutils
.
La risposta di Gerald Schade qui , può ancora essere migliorata!
Uso
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
Ecco un esempio completo di utilizzo in uno script :
#!/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
Per me ' sudo -v
' e ' sudo -l
' non hanno funzionato in uno script perché a volte interattivo (chiedendomi una password, come menzionato sopra). ' sudo -n -l
' Inoltre non ha funzionato, ha dato il codice di uscita '1' anche se ho i permessi sudo, a causa della password mancante. Ma estendendo il comando a:
A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor
ha avuto successo per me per la sceneggiatura. Questa espressione indica 0
se l'utente corrente può chiamare "sudo" e in 1
caso contrario.
Spiegazione:
Il parametro aggiuntivo -n
per sudo
impedire l'interattività.
L'output $A
del comando ' sudo -n -v 2>&1
' può essere:
- vuoto (in questo caso, sudo può essere chiamato dall'utente corrente), oppure:
- una nota che l'utente corrente non è autorizzato per sudo, oppure:
- un testo di domanda per il password (in questo caso, l'utente è autorizzato).
("asswor" si adatta sia a una "password" inglese che a un "passwort" tedesco).
Ho un voto basso per votare e commentare, ma volevo votare la risposta di Gerald Schade, poiché l'ho trovato l'unico modo in precedenza, e ho pensato che nessun altro lo sappia - fino ad ora: D
tra la mia soluzione:
[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]
(dalla fine del 2015 mwhahaaa)
L '"accesso al Sudo" è disponibile. Due gusti principali: per prima cosa tu o un gruppo di cui sei membro, devi essere configurato per l'accesso sudo nel file / etc / sudoers.
In secondo luogo, devi conoscere la tua password o devi aver eseguito un comando sudo di recente. Abbastanza recentemente che il timeout non è scaduto. (Curiosità: puoi fare in modo che il timeout sia molto lungo nel file del tuo sudoer.)
Spesso voglio testare il secondo tipo di accesso nel prologo di uno script che dovrà eseguire alcuni passaggi. Quando questo controllo fallisce, posso avvisare l'utente che deve abilitare il secondo tipo di accesso prima di eseguire lo script.
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 dice a sudo di leggere la password da stdin. -P imposta un prompt vuoto. -K cancella la seconda volta di accesso.
Poiché invia stderr a / dev / null, controllerà anche se l'utente ha il primo tipo di accesso sudo.
Seguire questi passaggi per visualizzare il file sudoers. Se ci sei, hai sudo. Altrimenti, puoi aggiungerti.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
sudo
, quindi probabilmente non è l' amministratore di sistema, né uno degli amministratori di sistema d'élite. Probabilmente è solo un utente che pensava che gli sarebbero stati concessi poteri limitati. Cosa ti fa sospettare che possa andare su
?