Identifica l'utente in uno script Bash chiamato da sudo


108

Se creo lo script /root/bin/whoami.shcontenente:

#!/bin/bash
whoami

e questo script viene chiamato da un utente con un sudo configurato correttamente, indicherà

root

Esiste un modo rapido per ottenere l'utente effettivo in uno script o dovrò ricorrere a parametri che passano questo nome utente?

Risposte:


134

$ SUDO_USER non funziona se stai usando sudo su -.
Richiede anche più controlli, se $USER == 'root'poi ottieni $SUDO_USER.

Invece del comando whoamiusa who am i. Questo esegue il whocomando filtrato per la sessione corrente. Ti dà più informazioni di quelle che ti servono. Quindi, fai questo per ottenere solo l'utente:

who am i | awk '{print $1}'

In alternativa (e più semplice) puoi usare logname. Fa la stessa cosa della dichiarazione precedente.

Questo ti dà il nome utente che ha effettuato l'accesso alla sessione.

Questi funzionano indipendentemente da sudoo sudo su [whatever]. Funziona anche indipendentemente da quante volte sue sudovengono chiamati.


2
Sì, +1, who am iè la risposta qui.
Joe Kearney

43
Alternativa a who am iè who mom likes. La tua scelta.
wchargin

3
whorestituisce 2 righe per me, entrambe contenenti il ​​mio nome e who am inessuna. Qualsiasi aiuto?
Hosh Sadiq

7
Sono su Ubuntu 16.04 e il comando who am inon fa nulla, sembra essere semplice who, quindi who | awk '{print $1}'funziona come previsto;)
daveoncode

1
Solo nel caso in cui non lo hai awkinstallato, puoi anche usare cut: who mom likes | cut -d' ' -f1 o sedper qualche motivo: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez

56

Penso che $ SUDO_USER sia valido.

#!/bin/bash
echo $SUDO_USER
whoami

1
Cosa strana: non sudo envmostra SUDO_USERma sudo echo $SUDO_USERnon stampa nulla ...
Giobbe

17
lavoro, questo non è strano, è previsto. in sudo echo $SUDO_USER, bash sta valutando $ SUDO_USER prima di eseguire sudo. prova lo script pubblicato in questa soluzione, funziona.

@quadmore: se sei soddisfatto della risposta, non dimenticare di accettarla.
Giobbe

2
Puoi anche usarlo echo ${SUDO_USER:-$USER}per catturare sia in sudoesecuzione che non sudo. Ma la risposta di logname Evan sembra più semplice
Tobias Kienzler

2
@TobiasKienzler - E come sottolinea evan, $SUDO_USERnon funziona sudo su -, ma lognamefunziona sempre.
David Harkness

13

Ecco come ottenere il nome utente della persona che ha chiamato lo script, indipendentemente dal fatto che sudo o meno:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

o una versione più breve

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`

8
ancora più breve: user=${SUDO_USER:-$(whoami)}ouser=$(logname)
Tobias Kienzler

3

who am i | awk '{print $1}'non ha funzionato per me, ma who|awk '{print $1}'servirà al lavoro


1
Non su un host in cui più di un utente ha una sessione
Roman Grazhdan


1

Usando whoami, who am i, who, ido$SUDO_USER non è proprio qui.

In realtà, who non è mai una soluzione alla domanda, poiché elencherà solo gli utenti registrati, che potrebbero essere dozzine ...

Ai miei occhi, l'unica risposta valida è l'uso di logname .

Spero che questo ti aiuti

rapinare


0

Se è l'UID che stai cercando (utile per gli imbrogli di Docker), allora funziona:

LOCAL_USER_ID=$(id -u $(logname))
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.