Come ottenere il nome dell'utente che ha eseguito uno script bash come sudo?


17

Voglio creare uno script bash che deve essere eseguito con sudo ma dovrebbe tenere conto del nome dell'utente non sudo che lo ha eseguito. Quindi, se l'utente bobesegue, sudo ./myscript.shvorrei myscript.shsapere che è bobstato colui che l'ha eseguito.

Diamo un'occhiata dentro myscript.sh:

USER=$(whoami)
# Do something that takes into account the username.

Come posso sapere il nome dell'utente che ha generato il processo? Più specificamente, cosa dovrei usare invece di whoamiottenere bobe no root?


Non è una sceneggiatura valida, penso che tu intendessi USER=$(whoami). Si noti che USEResiste già come variabile interna della shell. Inoltre, se è uno script bash, non eseguirlo usando sh, che ha solo un sottoinsieme di funzionalità compatibili con POSIX.
nyuszika7h,

perché non modificare? riparato ora.
marcio,

È troppo banale, le modifiche devono contenere almeno 6 caratteri, almeno quelli suggeriti.
nyuszika7h,

ok ho capito. Grazie per i suggerimenti: Di ​​solito metto un hashbang come questo #!/usr/bin/env bashsui miei script bash.
marcio,

L'hashbang viene ignorato se lo chiami esplicitamente con sho qualcos'altro.
nyuszika7h,

Risposte:


28

Non sono sicuro di quanto sia standard, ma almeno nei sistemi Ubuntu sudoimposta le seguenti variabili di ambiente (tra le altre, vedi la ENVIRONMENTsezione della manpage sudo):

   SUDO_UID        Set to the user ID of the user who invoked sudo

   SUDO_USER       Set to the login of the user who invoked sudo

per esempio,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver

Funziona come previsto su tutte le piattaforme che ho testato: debian, fedora (redhat) e freebsd. Grazie!
marcio,

Confermato il lavoro su un Mac.
SiKing,

Funziona anche su Ubuntu.
Andi Jay,

9

Se vuoi che funzioni anche senza sudo, usa ${SUDO_USER:-$USER}. Per esempio:

printf '%s\n' "${SUDO_USER:-$USER}"

Spiegazione

${var:-val}si espanderà a $var, a meno che non sia disattivato o vuoto, nel qual caso si espanderà a val.

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.