Sudo - c'è un comando per verificare se ho sudo e / o quanto tempo è rimasto?


27

(Originariamente pubblicato su Stack Overflow. Mi hanno suggerito di provare qui. Ecco il post originale: /programming/3858208/sudo-is-there-a-command-to-check-if-i-have -sudo-and-or-how-much-time-is-left )

Vedi titolo Voglio un comando che mi permetta di interrogare sudo. Idealmente, avrebbe successo se avessi ancora sudo e false se sudo fosse scaduto. Avere il tempo rimanente potrebbe anche essere utile (anche se se fossi preoccupato potrei semplicemente fare sudo -v per riconvalidare.) Oh e non dovrebbe richiedere una password.

La cosa più vicina che ho trovato è "sudo -n true", ma l'opzione -n ​​è presente solo sulla mia macchina Centos 5 al lavoro. -n fallisce se deve richiedere una password. C'è un altro modo per ottenere questa funzionalità? Supponiamo che in realtà non abbia root su tutte le macchine con cui lavoro, quindi non posso installare nuove versioni di sudo a mio piacimento.

Per quello che vale, lo sto facendo, così posso ricevere il mio prompt per indicare lo stato di sudo. Mi piace sapere quali terminali sono attivamente supportabili. Ho anche un prompt che cambia colore quando sono root, ma non uso root molto spesso, quindi è di utilità limitata.

Risposte:


10

L' -nopzione è disponibile nelle versioni più recenti di sudo, ma come hai detto non è un'opzione. Non c'è modo reale di fare quello che stai cercando a parte provare semplicemente sudo e vedere se ritorna con una richiesta di password. Se la tua preoccupazione è che desideri un'indicazione visiva, perché non avviare sudo / bin / bash per avviare una sessione di root bash? Nota che questo è insicuro, ma è anche un po 'insicuro se qualcuno realizza i tuoi rapidi cambiamenti su sudo.


1
+1 per le implicazioni di sicurezza di un indicatore visivo!
In pausa fino a nuovo avviso.

Quella parte non mi era venuta in mente. Quello che spero faccia l'indicatore è ricordarmi di eseguire sudo -K, invece di dimenticare che ho lasciato sudo attivo e lasciando aperti alcuni terminali potenzialmente pericolosi. Non che mi dimentichi spesso di bloccare lo schermo, ma mi piace l'assicurazione extra.
valadil,

Al momento mi sto orientando verso il controllo di sudo -V, e se è abbastanza nuovo da avere -n, controllando -n per ottenere la notifica. Sembra che non dovrebbe rompere nulla da nessuna parte.
valadil,

@valadil: mi viene in mente che un indicatore sottile non introdurrebbe troppi rischi per la sicurezza. Attiva la sottolineatura per il nome utente nel prompt, ad esempio.
In pausa fino a nuovo avviso.

@Dennis: esattamente. Non avrei cambiato il mio prompt in "OMG_YOU_HAVE_SUDO_NOW! _User @ host" o qualcosa del genere. Probabilmente cambierei un po 'il colore. Non mi aspetto che nessuno sappia cosa significhi a meno che non si siedano e si intestino con il mio .bashrc.
valadil,

29

So che questa è una domanda molto vecchia, ma qui ho fatto in una sceneggiatura oggi:

CAN_I_RUN_SUDO = $ (sudo -n uptime 2> & 1 | grep "load" | wc -l)
if [$ {CAN_I_RUN_SUDO} -gt 0]
poi
    echo "Posso eseguire il comando sudo"
altro
    echo "Non riesco a eseguire il comando Sudo"
fi

1

Il comando seguente mostrerà un'indicazione colorata che hai concesso sudo, quindi ti ricordi di fare un sudo -kprima di andartene dalla macchina. È utile anche su terminali non colorati.

Come possiamo avere sudo attivo e inattivo su diverse sessioni terminali, ho creato questo che puoi mettere alla fine del tuo ~ / .bashrc

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn=`if(($?==0));then echo true; else echo false; fi`

    history -a; # append to history at each command issued!!!
    local width=`tput cols`;
    local half=$((width/2))
    local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

Al tipo di terminale bashper testarlo. Aggiungerà anche un'intera riga ogni volta che esegui un comando, che contiene le informazioni sull'ora in cui è terminato l'ultimo comando, così puoi andare a pranzo e sapere quando è finito l'ultimo comando :).

Puoi giocare con questo codice per soddisfare le tue esigenze. C'è anche la variabile PS1 (che è l'attuale riga singola prompt piccolo), ma penso che sia meglio non scherzare con essa.

PS .: per OS-X, cerca il commento qui sotto di @nwinkler.


Il controllo del codice di uscita di sudo -nnon sembra funzionare su OS X. Vedi la mia domanda qui: superuser.com/questions/902826/…
nwinkler

bene, il test che propongo è sudo -n, credi che potrebbe esserci qualche altro test che potrebbe essere usato per determinare se l'utente ha accesso sudo attivo? o forse OS-X richiede qualche aggiornamento? Non ho mai usato OS-X a proposito.
Aquarius Power il

2
Sto usando l'ultima versione di OS X. È possibile che sudo -nsu BSD (su cui si basa OS X) abbia un comportamento diverso rispetto alla versione GNU. Ho appena aggiunto il mio commento per far sapere alle persone che questa versione del controllo non sembra funzionare su OS X. Ho usato un controllo da un'altra risposta ( sudo -n uptime 2>&1|grep "load"|wc -l), e questo sembra funzionare bene su OS X. Non è così elegante, ma funziona.
nwinkler,

1
@nwinkler oh, quindi in realtà dipende dall'output che genera (non dal valore restituito), soluzione interessante
Aquarius Power

@nwinkler ma è il più vicino possibile. O meglio perché sudo -ndiventa buggy in sudo -V 1.7.9
Marco M. von Hagen l'

1

Per semplificare la risposta data da @ wags007

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

Tuttavia, se nella tua configurazione https://www.sudo.ws/man/1.8.15/sudoers.man.html hai defaults mail_badpassci sarà una mail inviata per ogni test che risulterà falso (avrebbe richiesto). Per evitare questo fastidio, cambia quella parte del tuo file sudoers in

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

Di conseguenza, le e-mail di avviso di sicurezza vengono inviate per tutti i comandi tranne / bin / true. Ebbene si, qualcuno potrebbe ora provare a forzare una password chiamando sudo trueun numero illimitato di volte senza che venga inviato alcun messaggio di avviso di sicurezza.

Nota: utilizzare sempre al visudoposto dell'editor preferito per modificare il file sudoers. In caso contrario, si rischia di essere bloccato.


0

Secondo il manuale di sudo, la sessione di sudo è determinata in base al file timestamp ( /usr/lib/sudo/<username>), quindi potresti essere in grado di capire quanto tempo è rimasto controllando la data / ora del file timestamp. Tuttavia, nel mio sistema, il file timestamp è in realtà una directory e ci sono tre file con contenuto criptico (e anche alcuni strani timestamp, ma /usr/lib/sudo/<username>sembrava avere un timestamp che coincideva con il momento in cui ho dato sudo la mia password Penso che /usr/lib/sudo/<username>/0abbia il timestamp dell'esecuzione più recente sudo.


1
Sul mio sistema, i file timestamp si trovano in una directory che non può essere letta senza usare sudo, che richiede una password e quindi non funzionerebbe per le esigenze dell'OP.
In pausa fino a nuovo avviso.

Buon punto. Non ho verificato la proprietà di questi file. Hai ragione, sarebbe inutile.
Disastro il


0

Almeno su sudo 1.8.21p2, questo approccio funziona bene:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi

0

Questo è probabilmente un eccessivo eccessivo per lo standard della maggior parte delle persone, ma qui è la funzione (posixly correct) che uso per verificare se sudoè sbloccata (la funzione non perderà il suo tempo se l'utente che lo esegue root, in quanto non è necessario sbloccare sudo):

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo

-1

risposta semplice ...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0

Questo richiederà una password, se l'utente non ha già una sessione di sudo attiva
Slizzered

-2

Che ne dici della pagina man

man sudo

Elenca i tuoi comandi disponibili:

sudo -l

sudo stesso non ha limiti di tempo o data ... vedi:

man sudo
man sudoers

sudo -l mi dà una richiesta di password. Ne ho bisogno per dirmi che non ho una sessione di sudo attiva.
valadil,

lo stato di sudo scade, ma hai ragione se intendi che non ha una funzione di pianificazione.
In pausa fino a nuovo avviso.

Sì - scade il tempo - ma nessun programma.
Andreas Rehm,
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.