Come verificare se ho accesso sudo?


104

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?


Chiedi al tuo amministratore di sistema?
mdpc,

1
@mdpc: c'è un altro modo oltre a quello?
Bruce,

Non hai menzionato se è possibile ottenere l'accesso alla radice o meno.
mdpc,

46
Questa deve essere la prima istanza di vedere qualcuno che segue "Questo incidente verrà segnalato" .
slhck,

Risposte:


121

Corri sudo -v. Di solito viene utilizzato per estendere il timeout della password sudo, ma può essere utilizzato per determinare se si dispone di sudoprivilegi.

$ 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.


2
Grazie. sudo -v funziona per me. La pagina man dice che posso eseguire anche sudo -l ma che richiede una password. Perché?
Bruce,

2
@Bruce Sto indovinando qui, ma altrimenti qualcuno (o un programma che esegui) potrebbe scoprire quali programmi possono essere eseguiti (possibilmente senza inserire la password) dall'utente corrente e provare a utilizzare tali informazioni in modo dannoso.
Daniel Beck

Cosa pensi che significhi quando torno indietro 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 sudoeseguire correttamente altri comandi, ma quel unable to resolve hostmessaggio mi preoccupa che qualcos'altro potrebbe essere strano sull'host.
Patrick M,

@PatrickM Sembra un problema con il sudoersfile. Qui puoi specificare su quale host un utente è autorizzato ad eseguire un comando specifico (questo è utile quando usa lo stesso sudoersfile su più macchine). Forse il nome host specificato in quel file non è stato risolto. Prova a controllarlo con il hostcomando per esempio.
Ale,

Non funziona per me su RHEL 6, sudo -vdato che "xx non è nel file sudoers. Questo incidente verrà segnalato."
79E09796,

43

Questo è molto semplice Corri sudo -l. Questo elencherà tutti i privilegi di sudo che hai.


1
Forse ridimensionato perché ripete ciò che Daniel Beck ha detto quasi due anni fa.
G-Man il

1
O spiega cosa succede, nella migliore delle
ipotesi

2
@Jonathan: se dovessi scrivere ora su Ubuntu Rigt, ti sudo -lchiederà una password se puoi farlo o no. sudo -vchiede solo se puoi, e "$(whoami)" != "root"non chiederà mai nulla in nessun Linux.
domenica

@bksunday Hai ragione. Ho provato ora su una Debian Jessy pulita e ho confermato i tuoi risultati. Il mio precedente commento (cancellato ora) era probabilmente il risultato di un test su una macchina su cui avevo alcuni sudopriv.
Jonathan Ben-Avraham,

@G-Man ma questa semplice risposta mi ha aiutato molto probabilmente molto più precisamente la risposta di Daniel, dove questo comando è la fine sfortunatamente ...
Betlista,

11

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 sudodell'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.


Qualche alternativa per dove timeoutnon è disponibile per impostazione predefinita, ad esempio su OS X?
Harry

1
È necessario installare coreutils, ad es brew install coreutils.
Kenorb,

2
Questo non funziona per me in una sceneggiatura. Per ragioni inspiegabili la sceneggiatura si blocca fino a quando non la uccido.
Beruic,

7

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

2

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 0se l'utente corrente può chiamare "sudo" e in 1caso contrario.

Spiegazione:
Il parametro aggiuntivo -nper sudoimpedire l'interattività.
L'output $Adel 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).


2

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)


1
Leggi "Perché ho bisogno di 50 reputazione per commentare" per assicurarti di capire come puoi iniziare a commentare.
Pimp Juice IT

1

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.


-4

Seguire questi passaggi per visualizzare il file sudoers. Se ci sei, hai sudo. Altrimenti, puoi aggiungerti.

  1. su
  2. visudo
  3. Parte inferiore del file, immettere your_username_here ALL=(ALL) ALL
  4. Premi ESCe digita:wq
  5. genere exit
  6. Rieseguire il comando che era necessario sudo
  7. Inserisci la tua password (non la password del root)

11
L'OP "si è messo nei guai" per l'esecuzione 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?
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.