Soluzione 1:
Sì, ci sono 4 variabili d'ambiente impostate quando un programma è in esecuzione sotto sudo:
$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20
Si noti che questi possono essere falsificati semplicemente impostandoli. Non fidarti di loro per qualcosa di critico.
Ad esempio:in questo programma dobbiamo dire all'utente di eseguire qualche altro programma. Se quello attuale è stato eseguito con sudo, lo sarà anche l'altro.
#!/bin/bash
echo 'Thank you for running me.'
if [[ $(id -u) == 0 ]]; then
if [[ -z "$SUDO_COMMAND" ]]; then
echo 'Please now run: next_command'
else
echo 'Please now run: sudo next_command'
fi
else echo 'Error: Sadly you need to run me as root.'
exit 1
fi
Si noti che verifica solo una variabile SUDO_* se può prima provare che è in esecuzione come root. Anche allora lo usa solo per cambiare del testo utile.
Soluzione 2:
Questo non risponde direttamente alla domanda, ma non credo che qui venga posta la domanda giusta. Mi sembra che il richiedente voglia un programma che agirà in modo diverso presumibilmente se ha determinate autorizzazioni o meno, tuttavia direi che il controllo sudo non è il modo per farlo. Innanzitutto molti sistemi potrebbero non implementare un "sudo", non è assolutamente richiesto su Linux o molti Unix.
Ad esempio, un utente potrebbe essere già connesso come root, rendendo sudo privo di senso o forse il sistema ha utenti non root che hanno ancora le capacità per eseguire l'attività amministrativa che il programma potrebbe voler eseguire. Infine, forse il sistema non ha affatto root o sudo e utilizza invece un sistema di controllo degli accessi obbligatorio con funzionalità diverse e non cattura tutti i superuser in cui sudo. Oppure l'utente potrebbe essere sottoposto a sudo, ma in un account che ha meno autorizzazioni del proprio account per motivi di sicurezza (spesso eseguo codice non attendibile con un utente temporaneo non privilegiato che può solo scrivere su ramdisk per eliminare, non aumentare le mie autorizzazioni ). Nel complesso è una cattiva idea assumere un modello di autorizzazioni specifico come sudo o l'esistenza di root o presumere che un utente sudoed abbia particolari privilegi.
Se vuoi scoprire se hai i permessi per eseguire un'operazione il modo miglioreèdi solito semplicemente provare a farlo quindi controlla errno per problemi di permessi se fallisce o seèun'operazione a più stadi che deve fallire o avere successo puoi verificare se un'operazione funzionerà con funzioni come la funzione di accesso POSIX (fai attenzione alle possibili race condition qui se le autorizzazioni vengono attivamente modificate)
Se inoltre hai bisogno di conoscere l'utente reale dietro sudo puoi usare la funzione getlogin che dovrebbe funzionare per qualsiasi sessione interattiva con un terminale sottostante e ti consentirebbe ad esempio di trovare chi sta "veramente" eseguendo il comando per l'auditing o trova il directory home dell'utente reale per salvare i log.
Infine, se quello che vuoi veramente è scoprire se un utente ha accesso root (sempre una cattiva idea ma meno specifica per l'implementazione) puoi usare getuid per verificare la presenza di un uid pari a 0 e quindi root.
Soluzione 3:
Ci sono due meccanismi che possono essere utilizzati.
- Il controllo delle variabili d'ambiente può essere simulato in entrambi i modi, ma è il più facile da fare.
growisofs
non gli piace funzionare con SUDO, quindi annullo le variabili SUDO negli script in cui lo uso. Può essere simulato nell'altro modo. (La variabile SUDO viene anche trasferita nell'ambiente per gli script eseguiti con i comandi at e batch.) - Un altro modo per vedere se stai eseguendo sudo è quello di percorrere l'elenco dei processi dal tuo processo genitore fino alla ricerca di sudo. Sarebbe difficile nascondere che stavi correndo sotto sudo in questo modo, ma è più complesso. È ancora possibile fingere di correre sotto sudo.
È più comune verificare se si sta eseguendo come utente appropriato. Il id
comando può essere usato per fare questo. Lo script di TomOnTime utilizza il id
comando per determinare se sudo
potrebbe essere necessario eseguire il comando successivo.
Soluzione 4:
Puoi confrontare l'ID utente effettivo con quello reale.
Ciò non significa strettamente che sta eseguendo undo sudo (potrebbe anche essere setuid'd), ma indica che il programma ha più diritti di quanto l'utente possa aspettarsi. (per esempio in un programma che normalmente viene eseguito senza tali diritti, ma deve essere eseguito con loro durante l'installazione o per installare gli aggiornamenti. Quindi, puoi usarlo per dare un feedback di avviso al riguardo).
Soluzione 5:
Puoi controllare la variabile UID (EUID) effettiva, come segue:
if [[ $EUID -eq 0 ]]; then
echo "running as root"
else
echo "not running as root"
fi